ABC357
C Sierpinski carpet
https://atcoder.jp/contests/abc357/tasks/abc357_c
题解
这个题是个简单的递归题,我一开始没看出来怎么递归,😔,递归状态怎么设置呢?
dfs(x,y,k)表示填写的内容的起点是(x,y),长度为\(3^{k}\),怎么递归下去呢?他会被分成9个格子,每个格子的长度为\(3^{k-1}\),同时我们也能找到这9个格子的起点,这样递归下去即可
dfs(x,y,k-1);
dfs(x,y+pp,k-1);
dfs(x,y+2pp,k-1);
dfs(x+pp,y,k-1);
for(int i=x+pp;i<=x+2pp;i++)
for(int j=y+pp;j<=y+2pp;j++)
s[i][j]='.';
dfs(x+pp,y+2pp,k-1);
dfs(x+2pp,y,k-1);
dfs(x+2pp,y+pp,k-1);
dfs(x+2pp,y+2pp,k-1);
所以代码如下:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
char s[6600][6600];
int n;
void dfs(int x,int y,int k){
if(k==0){
s[x][y]='#';
return;
}
int pp=pow(3,k-1);
dfs(x,y,k-1);
dfs(x,y+pp,k-1);
dfs(x,y+2*pp,k-1);
dfs(x+pp,y,k-1);
for(int i=x+pp;i<=x+2*pp;i++)
for(int j=y+pp;j<=y+2*pp;j++)
s[i][j]='.';
dfs(x+pp,y+2*pp,k-1);
dfs(x+2*pp,y,k-1);
dfs(x+2*pp,y+pp,k-1);
dfs(x+2*pp,y+2*pp,k-1);
}
int main(){
cin>>n;
dfs(1,1,n);
int pp=pow(3,n);
for(int i=1;i<=pp;i++){
for(int j=1;j<=pp;j++)
cout<<s[i][j];
cout<<endl;
}
return 0;
}