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 }