#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n,k,i,j,N;
int *p= NULL;
scanf("%d",&N);
p=(int *)calloc(N*N,sizeof(int));
p[0*N+(N-1)/2]=1;
p[(N-1)*N+(N+1)/2]=2;
for(k=3;k<=N*N;k++)
{
for(i=0;i<=N-1;i++) /*若 (K−1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列*/
{
if(p[0*N+i]==k-1&&i!=N-1)
p[(N-1)*N+i+1]=k;
}
if(p[(N-1)*N+i+1]==k)
{
m=N-1;
n=i+1;
continue;
}
for(i=0;i<=N-1;i++) /*若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1)所在行的上一行*/
{
if(p[i*N+N-1]==k-1&&i!=0)
{
p[(i-1)*N+0]=k;
m=i-1;
n=0;
continue;
}
}
if(p[0*N+N-1]==k-1) /*若 (K-1)在第一行最后一列,则将 K 填在 (K-1) 的正下方*/
{
p[1*N+N-1]=k;
m=1;
k=N-1;
continue;
}
/* 若 (K-1) 既不在第一行,也不在最后一列,如果 (K-1) 的右上方还未填数,
则将 K 填在 (K-1) 的右上方,否则将 K 填在 (K-1) 的正下方。 */
for(i=0;i<=N-1;i++)
{
if(p[0*N+i]!=k-1&&p[i*N+N-1]!=k-1&&p[(m-1)*N+k+1]==0)
p[(m-1)*N+k+1]=k;
else p[(m+1)*N+k]=k;
}
}
for(i=0;i<=N-1;i++)
{
for(j=0;j<=N-1;j++)
printf(" %d",p[i*N+j]);
printf("\n");
}
free(p);
return 0;
}