1 #include<cstdio>
2 const int MAXN=33,MAXM=5;
3 int matchlist[MAXN][MAXN];
4 int m;
5 int main()
6 {
7 printf("Input m:");
8 scanf("%d",&m);
9 int n=1<<m,k=1,half=1; // 1<<m 相当于 2^m
10 matchlist[0][0]=1;
11 while (k<=m)
12 {
13 for (int i=0;i<half;i++) //构造右上方方阵
14 for (int j=0;j<half;j++)
15 matchlist[i][j+half]=matchlist[i][j]+half;
16 for (int i=0;i<half;i++) //对称交换构造下半部分方阵
17 for (int j=0;j<half;j++)
18 {
19 matchlist[i+half][j]=matchlist[i][j+half]; //左下方方阵等于右上方方阵
20 matchlist[i+half][j+half]=matchlist[i][j]; //右下方方阵等于左上方方阵
21 }
22 half*=2;
23 k++;
24 }
25 for (int i=0;i<n;i++)
26 {
27 for (int j=0;j<n;j++)
28 printf("%4d",matchlist[i][j]);
29 putchar('\n');
30 }
31 return 0;
32 }