二维数组斜线扫描心得与分析

 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("------打印主对角线上半面------------
");//斜线扫描,访问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	",arr[i][j]);
35             
36         }
37 
38         putchar(10);
39     }
40     
41 //打印主对角线下半面
42     printf("------打印主对角线下半面------------
");//斜线扫描,访问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	",arr[i][j]);
49         }
50         putchar(10);
51     }
52 //打印次对角线上半面
53     printf("------打印次对角线上半面------------
");//斜线扫描,访问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	",arr[i][j]);
60             
61         }
62 
63         putchar(10);
64     }
65 //打印次对角线下半面
66     printf("------打印次对角线下半面------------
");//斜线扫描,访问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	",arr[i][j]);
73         }
74         putchar(10);
75     }
76 
77     return 0;
78 }
79 
80 //总结,在斜线扫描的时候 1.打印对角线上半面的时候需要控制好列越界,打印对角线下半面的时候要控制好行越界
81 //                         2.    造成越界的原因:内层循环在控制扫描走向的时候,行列同时在变动,但是内层循环的结束条件只控制了行或者列,而没有对行列的结束同时控制。
82 //                         3.观察总结的1,2两条得到这样的结论:谁越界谁就是外层循环。例:列越界,就用列的下标做外层循环。行越界就用行的下标做外层循环。
原文地址:https://www.cnblogs.com/wangchaomahan/p/9503864.html