题目描述
继yzm10铺瓷砖后,我们又收到了一项重要的任务,Consumer要求yzm10在光滑的地面上再铺设一层地毯,并且邀请您进行设计。挑剔的Consumer选择了如(图片)所示图案。
谢尔宾斯基地毯:采用的是正方形进行分形构造,谢尔宾斯基地毯和它本身的一部分完全相似,因此具有自相似性。其三维结构便是著名的门格尔海绵。
yzm10给出了地毯的构造层数(n<6),现在请您进行设计。
输入
一个正整数n
输出
打印图案
样例输入
输入样例1: 1 输入样例2: 2 输入样例3: 3
样例输出
输出样例1: ###### ## ## ###### 输出样例2: ################## ## #### #### ## ################## ###### ###### ## ## ## ## ###### ###### ################## ## #### #### ## ################## 输出样例3: ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ###### ############ ############ ###### ## ## ## #### ## ## #### ## ## ## ###### ############ ############ ###### ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ################## ################## ## #### #### ## ## #### #### ## ################## ################## ###### ###### ###### ###### ## ## ## ## ## ## ## ## ###### ###### ###### ###### ################## ################## ## #### #### ## ## #### #### ## ################## ################## ###################################################### ## #### #### #### #### #### #### #### #### ## ###################################################### ###### ############ ############ ###### ## ## ## #### ## ## #### ## ## ## ###### ############ ############ ###### ###################################################### ## #### #### #### #### #### #### #### #### ## ######################################################
提示
为保证打印图案尽可能接近正方形,将"##"视作一个字符。行首行尾没有多余空格。
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool c[250][250];
void dfs(int x,int y,int s){//中心坐标,边长
if(s==0) return ;
for(int i=x-s/2;i<=x+s/2;i++){
for(int j=y-s/2;j<=y+s/2;j++){
c[i][j]=true;
}
}
dfs(x-s,y-s,s/3);dfs(x,y+s,s/3);
dfs(x+s,y+s,s/3);dfs(x+s,y,s/3);
dfs(x+s,y-s,s/3);dfs(x,y-s,s/3);
dfs(x-s,y+s,s/3);dfs(x-s,y,s/3);
}
int main(){
int n;
scanf("%d",&n);
int m=(int)pow(3,n);//图形的边长
dfs(m/2+1,m/2+1,m/3);//标记图形中间的空格
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(c[i][j]) printf(" ");
else printf("##");
}
printf("\n");
}
return 0;
}