#include <stdio.h>
#include <string.h>
int a[41][41]={0};//幻方
int b[41][2]={0};//b[x][0]为x所处的行数,b[x][1]代表x所处的列数
void f(int k,int n);//对大小为n的幻方,基于k-1的位置,填入k
int main()
{
int n;
scanf("%d",&n);
int t=(n+1)/2;
b[1][0]=1;
b[1][1]=t;
a[1][t]=1;
for(int i=2;i<=n*n;i++){
f(i,n);//将i填入幻方
printf("%d ",a[b[i][0]][b[i][1]]);//用于本人调试,调试发现,n小于784^0.5=28时,程序可以正常运行,n>28时,这一行代码最多输出到790,后续的printf输出不了值.
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",a[i][j]);
}
putchar('\n');
}
return 0;
}
void f(int k,int n){
if(b[k-1][0]==1&&b[k-1][1]!=n){
b[k][0]=n;
b[k][1]=b[k-1][1]+1;
}
else if(b[k-1][1]==n&&b[k-1][0]!=1){
b[k][1]=1;
b[k][0]=b[k-1][0]-1;
}
else if(b[k-1][0]==1&&b[k-1][1]==n){
b[k][0]=b[k-1][0]+1;
b[k][1]=b[k-1][1];
}
else if(b[k-1][0]!=1&&b[k-1][1]!=n){
if(a[b[k-1][0]-1][b[k-1][1]+1]==0){
b[k][0]=b[k-1][0]-1;
b[k][1]=b[k-1][1]+1;
}
else{
b[k][0]=b[k-1][0]+1;
b[k][1]=b[k-1][1];
}
}
a[b[k][0]][b[k][1]]=k;
}
RE了,求求大佬救救孩子,实在想不明白哪里出了问题