可以使用分治法来完成,数据小的话,直接暴力三个for循环也是可以的
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int N = 1e4 + 10;
int a[N][N],m;
void slove(int n,int h,int l,int add){
if(n==2){
a[h][l] = a[h+1][l+1] = 1 + add;
a[h+1][l] = a[h][l+1] = 2 + add;
return;
}
slove(n/2, h, l, add);
slove(n/2, h+n/2, l, add+n/2);
slove(n/2, h, l+n/2, add+n/2);
slove(n/2, h+n/2, l+n/2, add);
}
int main()
{
scanf("%d",&m);
m = pow(2,m);
slove(m, 1, 1, 0);
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
printf("%d%c",a[i][j],j==m?'\n':' ');
}
}
return 0;
}