题面
题目描述
自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷......帮忙,作为一个好孙子的孙子的孙子的孙子......你能做到吗?
输入输出格式
每个数据一个数字,表示图腾的大小(此大小非彼大小) n
输出格式
这个大小的图腾
输入输出样例
输入样例 #1
2
输出样例 #1
/
/__
/ /
/__/__
输入样例 #2
3
输出样例 #2
/
/__
/ /
/__/__
/ /
/__ /__
/ / / /
/__/__/__/__
分析
赤裸裸的谢尔宾斯基三角啊,直接考虑分治输出。
前导空格的处理有些技巧,详见代码。
如果你想了解更多的谢尔宾斯基三角形知识,可以戳我。(wikipedia
)
代码
很简单的分治递归操作。
/*
* @Author: crab-in-the-northeast
* @Date: 2020-02-23 16:14:17
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2020-02-23 16:32:21
*/
#include <iostream>
#include <cstdio>
#include <cstring>
const int maxn = 2055;
char a[maxn][maxn];
int qpow(int a,int p) {
int ans = 1, base = a;
while(p) {
if(p & 1) ans *= base;
base *= base;
p >>= 1;
}
return ans;
}//快速幂板子。
void draw(int x,int y,int depth) {
if(depth == 1) {//递归到最小层了,赋值
a[x][y] = a[x - 1][y + 1] = '/';
a[x][y + 1] = a[x][y + 2] = '_';
a[x][y + 3] = a[x - 1][y + 2] = '\';
return ;
}
int h = qpow(2,depth);//这是一个很巧妙的解法,我在这里光说你可能也不会理解,打个草稿
//你就明白了。
draw(x,y,depth-1);//分
draw(x,y + h,depth-1);//分
draw(x - (h >> 1),y + (h >> 1),depth-1);//分
}
int main() {
int n;
scanf("%d",&n);
memset(a,' ',sizeof(a));//初始化为空格
int h = qpow(2,n);
draw(h,1,n);
for(int i = 1; i <= h; i++,puts(""))
for(int j = 1; j <= h * 2; j++)
printf("%c",a[i][j]);
printf("
");
return 0;
}
评测结果
AC 100
:R30979237