幻方构造:

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;
}