https://www.luogu.org/problemnew/show/P5461
解法一:
找规律,结果是其左肩和右肩异或的结果。
#include<iostream>
using namespace std;
int n;
int a[1025][1025];
int main()
{
ios::sync_with_stdio(false);
cin>>n;
n = (1 << n);
a[1][n ] = 1;
for(int i = 1; i <= n; i++)
{
cout<<a[1][i]<<" ";
}
//system("pause");
cout<<endl;
for(int i = 2; i <= n; i++)
{
for(int j= 1; j <= n; j++)
{
a[i][j] = a[i-1][j] ^a[i-1][j+1];
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//system("pause");
}
解法二:递归模拟
#include<iostream>
#include<cstdio>
using namespace std;
int n, a[1025][1025];
void dfs(int length , int x, int y)//length是正方形的边长,x,y是左上角的顶点
{
if(length == 2)
{
a[x][y] = 0;
return ;
}
for(int i = x; i <= length/2 + x - 1; i++)
for(int j = y; j <= length/2 + y - 1; j++)
a[i][j] = 0;
dfs(length/2, x, y + length/2);
dfs(length/2, x + length/2, y);
dfs(length/2, x + length/2, y + length/2);
}
int main()
{
ios::sync_with_stdio(false);
scanf("%d", &n);
n = (1<<n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
a[i][j] = 1;
dfs(n, 1, 1);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
//system("pause");
}