#include <stdio.h>
int main()
{
int i,j,N;
int arr[15][15];
int s=0,t=0,tmp=0,x,m=1;//tmp=0 → ,tmp=1 ↓ ,tmp=2 ←,tmp=3 ↑
scanf("%d",&N);
for(i=0;i<N*N;i++)
{
x=tmp/4;//x表示第几圈
switch(tmp%4)
{
case 0:
if(t<(N-x)) arr[s][t++]=m++;
else {tmp++;t--;s++;i--;}
break;
case 1:
if(s<(N-x))
arr[s++][t]=m++;
else {tmp++;s--;t--;i--;}
break;
case 2:
if(t>=x) arr[s][t--]=m++;
else {tmp++;t++;s--;i--;}//i--是因为else的话赋值次数少一次,这样最后赋值结果就不是N*N个,所以每次else都--,控制赋值次数
break;
case 3:
if(s>x) arr[s--][t]=m++;
else {tmp++;s++;t++;i--;}
break;
default:
break;
}
}
for(i=0;i<N;i++) //输出结果
{
for(j=0;j<N;j++)
{
if(0==j) printf("%d",arr[i][j]);
else if((N-1)==j) printf("\t%d\n\n",arr[i][j]);
else printf("\t%d",arr[i][j]);
}
}
return 0;
}
结果: