方豆子
思路:很典的一道递归题,但当时没想到怎么递归/(ㄒoㄒ)/~~。赛后看了大佬的讲解知道要将这个图形看成由四个小正方形组成的大正方形,递归参数可以设置成(r1,c1,r2,c2,good)表示正方形的左上角坐标和右下角坐标以及当前这个正方形的状态(好/坏),如下图所示
所以为了知道这四个小正方形是如何由字符组成的,所以每次由当前这个正方形递归到这四个小正方形,dfs(r1,c1,rm,cm,-good),dfs(r1,cm+1,rm,c2,-good),dfs(rm+1,c1,r2,cm,-good),dfs(rm+1,cm+1,r2,c2,good)。当r1==r2时就是一级正方形,这个时候就可以将字符填充到数组中了,具体实现可看代码。
Code:
char a[4000][4000];
void dfs(int r1,int c1,int r2,int c2,int good)
{
if(r1==r2)
{
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
{
if(i>3&&j>3)
{
a[(r1-1)*6+i][(c1-1)*6+j]=(good==1?'.':'*');
}
else a[(r1-1)*6+i][(c1-1)*6+j]=(good==1?'*':'.');
}
return ;
}
int rm=(r1+r2)/2,cm=(c1+c2)/2;
dfs(r1,c1,rm,cm,-good);
dfs(r1,cm+1,rm,c2,-good);
dfs(rm+1,c1,r2,cm,-good);
dfs(rm+1,cm+1,r2,c2,good);
}
void solve()
{
int n;cin>>n;
dfs(1,1,(1<<n-1),(1<<n-1),1);//因为每个一级正方形是6*6,
//所以大正方形由(1<<n-1)*(1<<n-1)个一级正方形组成
//所以右下角坐标为((1<<n-1),(1<<n-1))
for(int i=1;i<=3*(1<<n);i++){
for(int j=1;j<=3*(1<<n);j++)
cout<<a[i][j];
cout<<endl;
}
}