/*======================================================================
二维数组右上左下遍历
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
输入
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出
按遍历顺序输出每个整数。每个整数占一行。
样例输入
3 4
1 2 4 7
3 5 8 10
6 9 11 12
样例输出
1
2
3
4
5
6
7
8
9
10
11
12
解析:这个题目需要分情况讨论行数和列数的大小关系,不同情况不同的处理方式。
上图当中,以土黄色斜排为分隔界限把矩阵分成了两个或三个部分,每一部分都需要用两重循环来完成。其中:外层循环控制斜排的层数,内层循环控制一个斜排内部的单元个数。
上三角部分斜排个数等于列数(row>col)或行数(row<col),下三角部分斜排的个数等于列数(row>col)或行数(row<col)(当然,其中有些部分需要注意多1或少1的问题,
毕竟分界线所在的斜排可以属于相邻的两个部分当中的任意一个。具体的请看代码和注释。)
========================================================================*/
1 #include<stdio.h>
2 int main()
3 {
4 int row,col,a[100][100],i,j,x,y,t;
5 freopen("55555.in","r",stdin);
6 freopen("result.out","w",stdout);
7 scanf("%d%d",&row,&col);
8 for(i=0;i<row;i++)
9 {
10 for(j=0;j<col;j++)
11 {
12 scanf("%d",&a[i][j]);
13 }
14 }
15 /*for(i=0;i<row;i++)
16 {
17 for(j=0;j<col;j++)
18 {
19 printf("%d ",a[i][j]);
20 }
21 printf("
");
22 }*/
23 /**/
24 if(row>col)
25 {
26 t=col;//斜排数量
27 for(j=0;j<t;j++)//循环处理每一个斜排
28 {
29 y=j;//每个斜排第一个单元的纵坐标
30 x=0;//每个斜排第一个单元的横坐标
31 for(i=0;i<=j;i++,x++,y--)//i控制每个斜排内部单元的个数
32 {
33 printf("%d
",a[x][y]);
34 }
35 }
36
37 t=row-col;
38 for(j=1;j<=t;j++)
39 {
40 y=col-1;
41 x=j;
42 for(i=1;i<=col;i++,x++,y--)
43 {
44 printf("%d
",a[x][y]);
45 }
46 }
47
48 t=col-1;
49 for(j=t;j>0;j--)
50 {
51 y=col-1;
52 x=row-j;
53 for(i=0;i<j;i++,x++,y--)
54 {
55 printf("%d
",a[x][y]);
56 }
57 }
58 }
59 else if(row<col)
60 {
61 t=row;
62 for(i=1;i<=t;i++)
63 {
64 x=0;
65 y=i-1;
66 for(j=1;j<=i;j++,x++,y--)
67 {
68 printf("%d
",a[x][y]);
69 }
70 }
71
72 t=col-row;
73 for(i=1;i<=t;i++)
74 {
75 x=0;
76 y=row+i-1;
77 for(j=1;j<=row;j++,x++,y--)
78 {
79 printf("%d
",a[x][y]);
80 }
81 }
82
83 t=row-1;
84 for(i=t;i>0;i--)
85 {
86 x=row-i;
87 y=col-1;
88 for(j=1;j<=i;j++,x++,y--)
89 {
90 printf("%d
",a[x][y]);
91 }
92 }
93 }
94 else
95 {
96 t=row;
97 for(i=1;i<=t;i++)
98 {
99 x=0;
100 y=i-1;
101 for(j=1;j<=i;j++,x++,y--)
102 {
103 printf("%d
",a[x][y]);
104 }
105 }
106
107 t=row-1;
108 for(i=t;i>0;i--)
109 {
110 x=row-i;
111 y=col-1;
112 for(j=1;j<=i;j++,x++,y--)
113 {
114 printf("%d
",a[x][y]);
115 }
116 }
117 }
118
119
120 return 0;
121 }
下面是一些测试案例:
1 |
2 |
4 |
7 |
11 |
16 |
22 |
3 |
5 |
8 |
12 |
17 |
23 |
29 |
6 |
9 |
13 |
18 |
24 |
30 |
36 |
10 |
14 |
19 |
25 |
31 |
37 |
43 |
15 |
20 |
26 |
32 |
38 |
44 |
50 |
21 |
27 |
33 |
39 |
45 |
51 |
57 |
28 |
34 |
40 |
46 |
52 |
58 |
64 |
35 |
41 |
47 |
53 |
59 |
65 |
71 |
42 |
48 |
54 |
60 |
66 |
72 |
78 |
49 |
55 |
61 |
67 |
73 |
79 |
85 |
56 |
62 |
68 |
74 |
80 |
86 |
92 |
63 |
69 |
75 |
81 |
87 |
93 |
99 |
70 |
76 |
82 |
88 |
94 |
100 |
105 |
77 |
83 |
89 |
95 |
101 |
106 |
110 |
84 |
90 |
96 |
102 |
107 |
111 |
114 |
91 |
97 |
103 |
108 |
112 |
115 |
117 |
98 |
104 |
109 |
113 |
116 |
118 |
119 |
1 |
2 |
4 |
7 |
11 |
16 |
22 |
28 |
34 |
40 |
46 |
52 |
58 |
64 |
70 |
3 |
5 |
8 |
12 |
17 |
23 |
29 |
35 |
41 |
47 |
53 |
59 |
65 |
71 |
76 |
6 |
9 |
13 |
18 |
24 |
30 |
36 |
42 |
48 |
54 |
60 |
66 |
72 |
77 |
81 |
10 |
14 |
19 |
25 |
31 |
37 |
43 |
49 |
55 |
61 |
67 |
73 |
78 |
82 |
85 |
15 |
20 |
26 |
32 |
38 |
44 |
50 |
56 |
62 |
68 |
74 |
79 |
83 |
86 |
88 |
21 |
27 |
33 |
39 |
45 |
51 |
57 |
63 |
69 |
75 |
80 |
84 |
87 |
89 |
90 |
1 |
2 |
4 |
3 |
5 |
7 |
6 |
8 |
10 |
9 |
11 |
12 |
1 |
2 |
4 |
7 |
3 |
5 |
8 |
11 |
6 |
9 |
12 |
14 |
10 |
13 |
15 |
16 |
这个其实可以考虑把上面的这么多次相类似的代码写成子函数。
(row<col)