幻方构造:
1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列;
2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行;
3.若 (K-1) 在第一行最后一列,则将 K 填在 (K-1) 的正下方;
4.若 (K-1) 既不在第一行,也最后一列,如果 (K-1) 的右上方还未填数,则将 K 填在 (K-1) 的右上方,否则将 L 填在 (K-1) 的正下方。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=40;
int tx,ty,n,g[N][N],m;
signed main(){
cin>>n; g[1][n/2+1]=1; tx=1,ty=n/2+1; m=n*n;
for(int i=2;i<=m;i++){
if(tx==1&&ty!=n) tx=n,ty++;
else if(tx!=1&&ty==n) tx--,ty=1;
else if(tx==1&&ty==n) tx++;
else if(tx!=1&&ty!=n){
if(!g[tx-1][ty+1]) tx--,ty++;
else tx++;
}
g[tx][ty]=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cout<<g[i][j]<<' ';puts("");
}
return 0;
}