原题链接:https://www.luogu.org/problem/P1498
题目描述
自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?
输入输出格式
输入格式:
每个数据一个数字,表示图腾的大小(此大小非彼大小) n<=10
输出格式:
这个大小的图腾
输入输出样例
输入样例#1:
2
输出样例#1:
/\
/__\
/\ /\
/__\/__\
输入样例#2:
3
输出样例#2:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
说明
时空限制:1000ms 125M
思路:
图形就是由一个不断向右复制一个再向上复制一个,慢慢扩大。所以只需要把第一个图形存入数组,接下来复制n-1次,不断将图形向右和向上复制一次,每次复制完后宽度变大两倍。
须注意的点:
- 数组ch[ ][ ]不仅要定义为全局变量,也要初始化,全部赋值为空格。
- ’ \ ’是转义字符,需写成’ \ ’。
- 第一个图形要倒着存入数组,这样才便于复制,不然无法向上复制,最后输出要从下往上,从左往右输出。
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
char ch[5000][5000]; //必须定义为全局变量
using namespace std;
int main(){
ios::sync_with_stdio(false); //取消同步
int n,wide=4;
cin>>n;
memset(ch,' ',sizeof(ch)); //全部初始化为空格
/*
将第一个图形倒着存入数组,这样才便于复制,不然无法向上复制
/\ /__\
/__\ /\
*/
ch[0][0]=ch[1][1]='/';
ch[0][1]=ch[0][2]='_';
ch[0][3]=ch[1][2]='\\';
for(int t=1;t<=n-1;t++){ //复制n-1遍
for(int i=0;i<wide/2;i++){ //遍历高
for(int j=0;j<wide;j++){ //遍历宽
ch[i][j+wide]=ch[i][j]; //向右复制一个
ch[i+wide/2][j+wide/2]=ch[i][j]; //向上复制一个,倒着存储
}
}
wide*=2; //图形扩大两倍
}
for(int i=wide/2-1;i>=0;i--){ //从下往上输出
for(int j=0;j<wide;j++){ //从左往右输出
cout<<ch[i][j];
}
cout<<endl; //换行
}
return 0;
}