题目描述
自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?
输入格式
每个数据一个数字,表示图腾的大小(此大小非彼大小) n<=10
输出格式
这个大小的图腾
输入输出样例
输入 #1复制
2
输出 #1复制
/\ /__\ /\ /\ /__\/__\
输入 #2复制
3
输出 #2复制
/\ /__\ /\ /\ /__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\/__\/__\
思路:我是靠dalao的题解才读懂题目的,,,刚开始是这个图形:
/\
/__\
每复制一次就向上向右复制一下自己本身,比如n=2时:
/\
/__\
/\ /\
/__\/__\
n=3时,再吧上面那个图形向上向右复制一次:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
每次复制的时候高度和宽度*2,如果我们按正常存储按顺序输出的话要把原来的图形再向下平移啥的很麻烦,所以我们考虑倒序着存倒序着输出。
先把图形初始化为全是空格。
把最小的图形倒着存入:
/__\
/\
循环n-1次,每次向左向右输出然后复制的高度加倍,代码实现是:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char g[10005][10005];
int n;
int main(){
cin>>n;
memset(g,' ',sizeof g);//注意要先把图形全初始化为空格
g[0][0]='/';
g[0][1]='_';
g[0][2]='_';
g[0][3]='\\';//注意反斜线不能直接存,要加斜线
g[1][1]='/';
g[1][2]='\\';
int wide=4;//最初的图形的宽度是4
for(int k=1;k<n;k++){//复制n-1次
for(int i=0;i<wide/2;i++){//高度是wide/2
for(int j=0;j<wide;j++){//宽度是wide
g[i][j+wide]=g[i][j];//向右复制
g[i+wide/2][j+wide/2]=g[i][j];//向下复制
}
}
wide*=2;//每次复制之后宽度成倍增加
}
for(int i=wide/2-1;i>=0;i--){//当宽度为wide时他最下面的一行是wide-1,但是出循环的时候wide多*2,所以我们先/2再-1
for(int j=0;j<wide;j++){
printf("%c",g[i][j]);
}
printf("\n");
}
return 0;
}