二维数组斜线扫描2(方法逻辑清晰)
1 #include <stdio.h> 2 3 #define M 10 4 #define N 10 5 int main(void) 6 { 7 int i,j; 8 //初始化二维数组 9 int arr[M][N] = { 10 {1,2,3,4,5,6,1,0,0,1}, 11 {1,2,3,4,1,6,1,1,0,1}, 12 {1,5,3,4,7,1,8,8,1,8}, 13 {1,2,0,4,5,6,1,0,0,1}, 14 {0,2,3,4,5,8,1,1,1,1}, 15 {1,0,3,4,8,6,1,1,1,0}, 16 {1,2,1,4,5,6,0,0,0,1}, 17 {1,2,3,0,5,8,1,0,1,1}, 18 {1,2,3,4,5,6,1,0,0,1}, 19 {0,2,3,4,5,6,1,0,0,1} 20 }; 21 /* 22 功能:测试主对角线上半面的数字(斜线扫描) 23 24 特征1: j起始于1,终止于N-1;i起始于0,每次终止不同,但归纳后终止于:M-1-j;(由此写出循环) 25 特征2:i++,j++ ,即行列同时+1 (由此确定打印的方向) 26 总结: 根据特征1和特征2 得出每次扫描的元素为:arr[i][j]; (由此写出打印的元素) 27 */ 28 printf("---------------测试主对角线上半面的数字(斜线扫描)---------------------\n"); 29 for(j = 1;j<N;j++) 30 { 31 for(i = 0;i<M-j;i++) 32 { 33 printf("%d\t",arr[i][i+j]); 34 } 35 putchar(10); 36 } 37 printf("-----------------测试主对角线下半面的数字(斜线扫描)--------------------\n"); 38 /* 39 功能:测试主对角线下半面的数字(斜线扫描) 40 41 特征1: i起始于1,终止于M-1;j起始于0,每次终止不同,但归纳后终止于:N-i-1;(由此写出循环) 42 特征2:i++,j++ ,即行列同时+1 (由此确定打印的方向) 43 总结: 根据特征1和特征2 得出每次扫描的元素为:arr[j+i][j]; (由此写出打印的元素) 44 */ 45 for(i = 1;i<M;i++) 46 { 47 for(j = 0;j<N-i;j++) 48 { 49 printf("%d\t",arr[j+i][j]); 50 } 51 putchar(10); 52 } 53 printf("-----------------测试次对角线上半面的数字(斜线扫描)--------------------\n"); 54 /* 55 功能:测试次对角线上半面的数字(斜线扫描) 56 57 特征1: j起始于N-2,终止于0 ; i起始于0,每次终止不同,但归纳后终止于:M-(N-j-1); (由此写出循环) 58 特征2:i++,j-- ,即行列同时变化,行+1,列-1 (由此确定打印的方向) 59 总结: 根据特征1和特征2 得出每次扫描的元素为:arr[i][j-i]; (由此写出打印的元素) 60 */ 61 for(j = N-2;j>=0;j--) 62 { 63 for(i = 0;i<M-(N-j-1);i++) 64 { 65 printf("%d\t",arr[i][j-i]); 66 } 67 putchar(10); 68 } 69 70 printf("-----------------测试次对角线下半面的数字(斜线扫描)--------------------\n"); 71 /* 72 功能:测试次对角线下半面的数字(斜线扫描) 73 74 特征1: i起始于1,终止于M-1 ; j起始于N-1,每次终止不同,但归纳后终止于:i; (由此写出循环) 75 特征2:i++,j-- ,即行列同时变化,行+1,列-1 (由此确定打印的方向) 76 总结: 根据特征1和特征2 得出每次扫描的元素为:arr[N-j+i-1][j]; (由此写出打印的元素) 77 */ 78 for(i = 1;i<M;i++) 79 { 80 for(j = N-1;j>=i;j--) 81 { 82 printf("%d\t",arr[N-j+i-1][j]); 83 } 84 putchar(10); 85 } 86 87 return 0; 88 }