//将其当作一个画笔,每次移动一段距离后更改方向,根据n=3,n=4的情况,发现除了第一次距离减少时转了三次距离才减一,其他都是转两次就距离减一
#include<bits/stdc++.h> int main(void) {
int n=0;
scanf("%d",&n);
int a[19][19];
a[n-1][0]=1;
int number=1;//决定每次的方向(1,2,3,4分别对应右下左上)
int len=n-2;//决定每次移动的长度
int starX=n-1,starY=0;//标明起始坐标
int j=2;//可以看作是矩阵的第几个(按照回型)
int count=0;//记录每个方向的执行移动次数(每次变换方向后从0开始)
int flag=1;//判断是否为第一次距离减少
while(len>=0)//判断是否为最后一次转向
{
if(number%4==0)
{
for(int i=starX+1;i<=starX+1+len;i++)
{
a[i][starY]=j;
j++;
// printf("j==%d\t",j); } starX+=len+1; number++; }
else if(number%4==3)
{
for(int i=starY-1;i>=starY-1-len;i--)
{
a[starX][i]=j;
j++;
// printf("number=%d\t",number); } starY-=len+1; number++; }
else if(number%4==2)
{
for(int i=starX-1;i>=starX-1-len;i--)
{
a[i][starY]=j;
j++;
// printf("==%d\t",len); } starX-=len+1; number++; }
else{
for(int i=starY+1;i<=starY+1+len;i++)
{
a[starX][i]=j;
j++;
}
starY+=len+1;
number++;
}
count++;
if(count==3&&flag==1){
len--;
flag=0;
}
else if((count-3)%2==0&&flag==0)len--;
}
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}