#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 1030;
int b[N][N],n,a,x,y;
void solve(int a, int x, int y) //x和y是正方形左上角的坐标
{
if(a == 2)//最小到边长为2:四个方格左上角为1
{
b[x][y] = 1;
return;
}
for(int i = x; i < a/2+x; i ++)
for(int j = y; j < a/2+y; j ++)
b[i][j] = 1;
//去递归解决三个方向的小正方形
solve(a/2, x+a/2, y);
solve(a/2, x, y+a/2);
solve(a/2,x+a/2,y+a/2);
}
int main()
{
scanf("%d", &n);
a = pow(2,n);
solve(a, 1,1);
for(int i = 1; i <= a; i++)
{
for(int j = 1; j <= a; j ++)
{
if(b[i][j] == 1)
printf("0 ");
else
printf("1 ");
}
printf("\n");
}
return 0;
}
递归解决子问题,思路很重要,代码不难实现。
设置递归边界,然后解决子问题就可以。
用到的技巧:
* 1和0无所谓,给个判断就行;