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 }