#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int pre_r=0,pre_c=0;
int n;//方阵大小
scanf("%d",&n);
int s=0,num=n*n;//,quan=0;
int Fz[n+1][n+1]={0};//初始化
//Fz[pre_r][pre_c]=s;
int h=n-(n-1);//横着走的次数从第一圈开始,h=n-(要走多少列),此后每次后移一列
//奇数有bug ,无法到达最后一圈。
int Q;
if( n%2!=0)
Q=(n/2)+1;//奇数让圈数正常
else Q=(n/2);
for(int quan=0;quan<Q&&s<num;quan++){
int c=0,r=0;
for(c=pre_c+1;c<=n-quan&&s<num;c++)//横着走,列变
{
if(pre_r==0){//第一圈,不太一样
pre_r++;
}
Fz[pre_r][c]=++s;
// printf("%3d",Fz[pre_r][c]);
}
pre_r=pre_r; pre_c=--c;//指向拐角点 1
c=0;//复位
for(r=pre_r+1;r<=n-quan&&s<num;r++)//竖着走,行变
{
Fz[r][pre_c]=++s;
// printf("%3d",Fz[r][pre_c]);
}
pre_r=--r; pre_c=pre_c;//指向拐角点 2
r=0;//复位
// h为要走到的列数
for(c=pre_c-1;c>=(h)&&s<num;c--)//底 横着走
{
Fz[pre_r][c]=++s;
// printf("%3d",Fz[pre_r][c]);
}
h++;//后移一列, 有下一圈时用
pre_r=pre_r; pre_c=++c;//c第一次会走到超1左列,加回来
c=0;//复位
int x=quan+2;//记上竖走 哪行
for(r=pre_r-1;r>=(x)&&s<num;r--)//上 竖着走
{
Fz[r][pre_c]=++s;
// printf("%3d",Fz[r][pre_c]);
}
pre_r=++r; pre_c=pre_c;
r=0;//复位
//一圈完成
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%3d",Fz[i][j]);
}
printf("\n");
}
return 0;
}