#include<stdio.h>
int dx[] = {0, 1, 0, -1},dy[] = {1, 0, -1, 0};
//用于进行数组方向的判断,也就是数组变化时相应的值的变化
int res[105][105];
int main()
{
int n;
scanf("%d", &n);
int x = 0, y = 0, d = 0;
//(x,y)表示当前坐标,d是进行方向切换的开关
for(int i = 0; i < n * n; i++)
{
res[x][y] = i;
int a = x + dx[d], b = y + dy[d];
//(a,b)表示下一步坐标,巧妙地利用了-1 0 1 0四个数在指向性上的特殊性
if(a >= n || a < 0 || b >= n || b < 0 || res[a][b])
// 不合法,包括四个角和回到原来已经出现过的元素时
{//先保证最外围的一圈能够成立,然后始终判断res[a][b]是否出现过,出现过则立刻给a重新赋值并且立刻转向;
d = (d + 1) % 4;
//数组下标和真下标之间差1,并且要满足超出循环范围就切换填充的方向
a = x + dx[d], b = y + dy[d];//立刻转向
}
x = a, y = b;
}
for(int i = 0; i < n; i ++ )
{
for(int j = 0; j < n; j ++ )
printf("%3.d", res[i][j]);
printf("\n");
}
return 0;
}