#include<stdio.h>
#include<string.h>
#include<malloc.h>
int p[15][15];
int temp=0;
//pos 位置
//size 边长
//num 起始值
void fill(int pos,int size,int num)
{
int i,n;
if(size<=0)
return;
if(size==1)
{
p[pos][pos]=num;
return;
}
n=num;//取初始值填充
//三角形横边 填充值
for(i=pos;i<pos+size;i++)
p[pos][i]=n++;
temp=pos+i;
//三角形斜边 填充值
for(i=pos+1;i<pos+size;i++)
p[i][temp-1-i]=n++;
//三角形竖边 填充值
for(i=pos+size-2;i>pos;i--)
p[i][pos]=n++;
fill(pos+1,size-3,num+3*size-3);
}
int main()
{
int i,j,n;
scanf("%d",&n);
fill(0,n,1);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(p[i][j]!=0)
printf("%4d",p[i][j]);
}
printf("\n");
}
return 0;
}
void fill(int pos,int size,int num)
{
int i,n;
if(size<=0)
return;
if(size==1)
{
p[pos][pos]=num;
return;
}
n=num;//取初始值填充
//三角形横边 填充值
for(i=pos;i<pos+size;i++)
p[pos][i]=n++;
temp=pos+i-1;//斜边的坐标之和是相等的,记录下横边的最后一个坐标的 和
//此时i++ 执行了一次,所以要减去1
//三角形斜边 填充值
for(i=pos+1;i<pos+size;i++)
p[i][temp-i]=n++;
//三角形竖边 填充值
for(i=temp-1-pos;i>pos;i--)
p[i][pos]=n++;
fill(pos+1,size-3,num+3*size-3);
}