题目链接:
/*奇数阶幻方的de la loubere方法首先给出幻方的大小n [i,j]所要移动到的位置是[x,y]x=i==1?n:i+1y=j==n?1:j+1if([i,j]所要移动的方向已被占 即map[x,y]!=0) 则x=i==n?1:i-1; if(map[x,y]!=0)//出现这个问题的时候说明已经塞满了 break;i=x;j=y; */#include#include 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<<"\n"; } } return 0;}