1 /*@coder Gxjun*/ 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #define maxn 100 6 int map[maxn][maxn] ; 7 void creat_magic(int n,int x,int y ,int sn) //奇阶幻方构造 8 { 9 int i,j,k; 10 i=0; 11 j=n/2; 12 for(k=n;k<=n*n;k++) 13 { 14 map[i+x][j+y]=k+sn; 15 if(k%n!=0) 16 { 17 if(i!=0) i--; 18 else i=n-1; 19 if(n==j+1) j=0; 20 else j++; 21 } 22 else 23 { 24 if(i==n-1)i=0; 25 else i++; 26 } 27 } 28 } 29 30 void magic_4(int n) 31 { 32 int i,j; 33 for(i=0 ; i<n ;i++) 34 { 35 for(j=0 ; j<n ;j++) 36 { 37 if((i%4==0||i%4==3)&&(j%4==0||j%4==3)||(i%4==1||i%4==2)&&(j%4==1||j%4==2)) 38 { 39 map[i][j]=n*n-(i*n+j); 40 } 41 else 42 { 43 map[i][j]=i*n+j+1; //i*n+j+n 44 } 45 } 46 } 47 } 48 49 void magic_other(int n) 50 { 51 int i,j,t; 52 creat_magic(n/2,0,0,0); 53 creat_magic(n/2,n/2,n/2,n*n/4); 54 creat_magic(n/2,0,n/2,n*n/2); 55 creat_magic(n/2,n/2,0,n*n/4); 56 for(i=0;i<n/2;i++) 57 { 58 for(j=0;j<n/4;j++) 59 { 60 if(i!=n/4||j!=0) 61 { 62 /*<swap>*/ 63 t=map[i][j]; 64 map[i][j]=map[i+n/2][j]; 65 map[i+n/2][j]=t; 66 } 67 } 68 } 69 t=map[n/4][n/4]; 70 map[n/4][n/4]=map[n/4+n/2][n/4]; 71 map[n/4+n/2][n/4]=t; 72 for(i=0;i<n/2;i++) 73 { 74 for(j=n-n/4+1 ;j<n;j++) 75 { 76 t=map[i][j]; 77 map[i][j]=map[i+n/2][j]; 78 map[i+n/2][j]=t; 79 } 80 } 81 } 82 int main() 83 { 84 int n,i,j; 85 while(scanf("%d",&n)!=EOF) 86 { 87 memset(map,0,sizeof(map)); 88 if(n&1) creat_magic(n,0,0,0); 89 else if(n%4==0) magic_4(n); 90 else magic_other(n); 91 for(i=0;i<n;i++) 92 { 93 for(j=0;j<n;j++) 94 { 95 printf("%d ",map[i][j]); 96 } 97 putchar(10); 98 } 99 } 100 return 0; 101 }