1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 int aa[105][105];
6 int n,x,a,b,i,j;
7 scanf("%d",&n);
8 x=1;//第一个元素从 1 开始,
9 memset(aa,0,sizeof(aa));
10 for(i=0;i<=n+1;i++)/*多添加了 (n+2)*(n+2) 边界元素全部为 1 作为边界用于判断*/
11 {
12 for(j=0;j<=n+1;j++)
13 {
14 if(i==0||i==n+1||j==0||j==n+1)
15 aa[i][j]=1;
16 //printf("%d ",aa[i][j]);
17 }
18 // printf("\n");
19 }//printf("\n");
20
21 int flag=0;/*蛇形方向 下 左 上 右 0表示向下走 ,1表示向左,2表示向上,3表示向右*/
22
23 a=0;b=n;
24 while(x!=n*n+1)
25 {
26 //printf(" flag1=%d x=%d \n==%d",flag,x,flag%4);
27 //printf("\na1=%d b1=%d\n",a,b);
28 if(flag%4==0)
29 //向下移动
30 {
31 if(!aa[a+1][b])/*判断是否到了下边界a+1*/ aa[++a][b]=x++;
32 else flag++;
33 }
34 if(flag%4==1)
35 //向左移动
36 {
37 if(!aa[a][b-1])/*判断是否到了左边界b-1*/ aa[a][--b]=x++;
38 else flag++;
39 }
40 if(flag%4==2)
41 //向上移动
42 {
43 if(!aa[a-1][b])/*判断是否到了上边界a-1*/ aa[--a][b]=x++;
44 else flag++;
45 }
46 if(flag%4==3)
47 //向右移动
48 {
49 if(!aa[a][b+1])/*判断是否到了右边界b+1*/ aa[a][++b]=x++;
50 else flag++;
51 }
52 // printf("flag2=%d x=%d \n",flag,x);
53 // if(x==n*n+1) break;
54 // printf("a2=%d b2=%d\n\n",a,b);
55
56 /* for(i=0;i<=n+1;i++)
57 {
58 for(j=0;j<=n+1;j++)
59 printf("%d ",aa[i][j]);//输出格式
60 printf("\n");
61 }printf("\n"); */
62 }
63
64 //printf("flag=%d x=%d \n",flag,x);
65
66 for(i=1;i<=n;i++)
67 {
68 //printf("*****\n");从i=1,j=1开始输出
69 for(j=1;j<=n;j++)
70 printf("%d ",aa[i][j]);//输出格式
71 printf("\n");
72 }
73 return 0;
74 }