1 /* 2 问题 输入矩阵的规模n,先将数按照下,右,上,左的顺序填入矩阵,再按照这样的顺序取出。 3 解题思路 模拟,按照笔的顺序存入取出,注意初始化的时候一定将矩阵全部初始化。 4 */ 5 #include<cstdio> 6 #include<cstring> 7 const int N=1001; 8 int a[N][N],b[N][N]; 9 int main() 10 { 11 int n,i,j,tot,x,y; 12 while(scanf("%d",&n) != EOF){ 13 //蛇形填数 14 x=0; 15 y=0; 16 tot=0; 17 memset(a,0,sizeof(int)*N*N);//一定要初始化全部,否则出现不可预估的错误 18 while(tot < n*n){ 19 while(x < n && !a[x][y]){ 20 a[x][y] = ++tot; 21 x++; 22 } 23 24 x--; 25 y++; 26 while(y < n && !a[x][y]){ 27 a[x][y]=++tot; 28 y++; 29 } 30 31 y--; 32 x--; 33 while(x >= 0 && !a[x][y]){ 34 a[x][y] = ++tot; 35 x--; 36 } 37 38 x++; 39 y--; 40 while(y >= 0 && !a[x][y]){ 41 a[x][y] = ++tot; 42 y--; 43 } 44 45 y++; 46 x++; 47 } 48 for(i=0;i<n;i++){ 49 for(j=0;j<n;j++){ 50 printf("%d ",a[i][j]); 51 } 52 printf(" "); 53 } 54 //蛇形取数 55 x=0; 56 y=0; 57 tot=0; 58 memset(b,0,sizeof(int)*N*N); 59 while(tot < n*n){ 60 while(x < n && !b[x][y]){ 61 printf("%d ",a[x][y]); 62 b[x][y]=1; 63 ++tot; 64 x++; 65 } 66 x--; 67 y++; 68 while(y < n && !b[x][y]){ 69 printf("%d ",a[x][y]); 70 b[x][y]=1; 71 ++tot; 72 y++; 73 } 74 75 y--; 76 x--; 77 while(x >= 0 && !b[x][y]){ 78 printf("%d ",a[x][y]); 79 b[x][y]=1; 80 ++tot; 81 x--; 82 } 83 84 x++; 85 y--; 86 while(y >= 0 && !b[x][y]){ 87 printf("%d ",a[x][y]); 88 b[x][y]=1; 89 ++tot; 90 y--; 91 } 92 93 y++; 94 x++; 95 } 96 printf(" "); 97 } 98 return 0; 99 }