二维数组斜线扫描心得与分析
1 #include <stdio.h> 2 /* 3 打印以对角线为界的半面的数据 4 5 int arr[5][5] = { 1, 2, 3, 4, 5, 6 6, 7, 8, 9,10, 7 11,12,13,14,15, 8 16,17,18,19,20, 9 21,22,23,24,25 }; 10 11 1.打印主对角线上半面 12 2.打印主对角线下半面 13 3.打印次对角线上半面 14 4.打印次对角线下半面 15 16 */ 17 #define M 5 18 #define N 5 19 int main(void) 20 { 21 int i,j; 22 int arr[M][N] = { 1, 2, 3, 4, 5, 23 6, 7, 8, 9,10, 24 11,12,13,14,15, 25 16,17,18,19,20, 26 21,22,23,24,25 }; 27 //打印主对角线上半面 28 printf("------打印主对角线上半面------------\n");//斜线扫描,访问2->8->14->20->3->9->15->4->10->5 ;关键点:每次扫描下一个元素,行数和列数的都增加1。最后控制列越界的情况即可。 29 for(j = 1;j<=4;j -= 3)//列从第二列开始终止于第5列, 30 { 31 for(i = 0;i<=3;i++,j++)//行从第一行开始终止于第4行 32 { 33 if(j<=4)//j会出现越界的情况,将列始终控制在5列之内。 34 printf("%d\t",arr[i][j]); 35 36 } 37 38 putchar(10); 39 } 40 41 //打印主对角线下半面 42 printf("------打印主对角线下半面------------\n");//斜线扫描,访问6->12->18->24->11->17->23->16->22->21 ;关键点:每次扫描下一个元素,行数和列数的都增加1。最后控制行越界的情况即可。 43 for(i = 1;i<=4;i-=3) 44 { 45 for(j = 0;j<=3;i++,j++) 46 { 47 if(i<=4) 48 printf("%d\t",arr[i][j]); 49 } 50 putchar(10); 51 } 52 //打印次对角线上半面 53 printf("------打印次对角线上半面------------\n");//斜线扫描,访问4->8->12->16->3->7->11->2->6->1 ;关键点:每次扫描下一个元素,行数+1和列数-1。最后控制列越界的情况即可。 54 for(j = 3;j>=0;j += 3) 55 { 56 for(i = 0;i<=3;i++,j--) 57 { 58 if(j>=0) 59 printf("%d\t",arr[i][j]); 60 61 } 62 63 putchar(10); 64 } 65 //打印次对角线下半面 66 printf("------打印次对角线下半面------------\n");//斜线扫描,访问10->14->18->22->15->19->23->20->24->25 ;关键点:每次扫描下一个元素,行数+1和列数-1。最后控制行越界的情况即可。 67 for(i = 1;i <= 4;i-=3) 68 { 69 for(j = 4;j>=1;i++,j--) 70 { 71 if(i<=4) 72 printf("%d\t",arr[i][j]); 73 } 74 putchar(10); 75 } 76 77 return 0; 78 } 79 80 //总结,在斜线扫描的时候 1.打印对角线上半面的时候需要控制好列越界,打印对角线下半面的时候要控制好行越界 81 // 2. 造成越界的原因:内层循环在控制扫描走向的时候,行列同时在变动,但是内层循环的结束条件只控制了行或者列,而没有对行列的结束同时控制。 82 // 3.观察总结的1,2两条得到这样的结论:谁越界谁就是外层循环。例:列越界,就用列的下标做外层循环。行越界就用行的下标做外层循环。