1、数字1位于第一行正中间
2、下一个数放到上一个数的右上角(即上一行下一列),若无上一行放到最后一行,若无下一列则放到第一列
3、若新位置已经放了数,则将其放到该数的正下方(即下一行的同一列)
#include<stdio.h>
#include<string.h>
int main(){
int n=5,i,j,p,q;
int a[5][5]={0};
a[0][n/2]=1;
p=0;q=n/2;
for(int x=2;x<=n*n;x++){
i=p;j=q; //记录前一个位置
p-=1;q+=1;
if(p<0&&q>=n) //行列超出范围
{p+=n;q-=n;}
else if(p<0){p+=n;} //行超出范围
else if(q>=n){q-=n;} //列超出范围
if(a[p][q]!=0){p=i+1;q=j;}
a[p][q]=x;
}
for(int i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}