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+2
pp;i++)
for(int j=y+pp;j<=y+2pp;j++)
s[i][j]='.';
dfs(x+pp,y+2
pp,k-1);
dfs(x+2pp,y,k-1);
dfs(x+2
pp,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;	
}
posted @ 2024-06-29 16:30  xinyimama  阅读(10)  评论(0编辑  收藏  举报