#include<stdio.h>
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
要考虑三个方向,并且要按先后考虑
1:当前位置的斜上方
2:(若前一方向不行)当前方向的正下方
3:(若前一方向不行)当前方向的左上方
要注意的是虽然矩阵是n*n的,但是想的时候要把矩阵扩展,这就是(h-1+n)%n之类的原因