题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1998
/*奇数阶幻方的de la loubere方法 首先给出幻方的大小n [i,j]所要移动到的位置是[x,y] x=i==1?n:i+1 y=j==n?1:j+1 if([i,j]所要移动的方向已被占 即map[x,y]!=0) 则x=i==n?1:i-1; if(map[x,y]!=0)//出现这个问题的时候说明已经塞满了 break; i=x; j=y; */ #include<iostream> #include<cstring> using namespace std; const int maxn=25; int map[maxn][maxn]; int n,t; int main(){ cin>>t; while(t--){ cin>>n; int i=1,j=n/2+1,x,y; memset(map,0,sizeof(map)); int k=1; while(1){ map[i][j]=k; x=i==1?n:i-1; y=j==n?1:j+1; if(map[x][y]) { x=i==n?1:i+1; y=j; if(map[x][y]) break; } i=x; j=y; k++; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) printf("%4d",map[i][j]);//c语言的右对齐!!!!!学习了 cout<<" "; } } return 0; }