/*====================================================================== 二维数组右上左下遍历 总时间限制: 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("\n"); 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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",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)