题目描述
自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?
输入输出格式
输入格式:
每个数据一个数字,表示图腾的大小(此大小非彼大小) n<=10
输出格式:
这个大小的图腾
输入输出样例
输入样例#1:
2
输出样例#1:
/\
/__\
/\ /\
/__\/__\输入样例#2:
3
输出样例#2:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
思路:
一开始题都看不懂,问了队里的数学大佬才知道是一个谢尔宾斯基三角形。。。
然而即使知道了分形图形但还是没有思路。。。
看了题解,才明白这题实质上是个递归。。。说白了就是图腾每次扩大时,向右复制一个,再向上复制一个。。。
用题解的思路,将图腾倒放存储,通过递归,扩大时把原图腾向右复制一个,再向下复制一个,最后倒置输出。
源代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 10001
#define MOD 123
#define E 1e-6
using namespace std;
char a[N][N];
int main()
{
int n;
cin>>n;
memset(a,' ',sizeof(a));//先全部置为空格
/*
将第一个图形倒着存入
/\ /__\
/__\ /\
*/
a[0][0]='/';
a[0][1]='_';
a[0][2]='_';
a[0][3]='\\';//反斜杠无法直接输出,需要再其前面再加一个反斜杠
a[1][1]='/';
a[1][2]='\\';//反斜杠无法直接输出,需要再其前面再加一个反斜杠
int wide=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表示图形宽度
{
a[i][j+wide]=a[i][j];//向右复制
a[i+(wide/2)][j+(wide/2)]=a[i][j];//向下复制
}
wide*=2;//每次图形分形扩大两倍
}
for(int i=(wide/2)-1;i>=0;i--)//倒序输出
{
for(int j=0;j<wide;j++)
cout<<a[i][j];
cout<<endl;
}
return 0;
}