[luogu p1498] 南蛮图腾

传送门

题面

题目描述

自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷......帮忙,作为一个好孙子的孙子的孙子的孙子......你能做到吗?

输入输出格式

每个数据一个数字,表示图腾的大小(此大小非彼大小) 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("\n");
    return 0;
}

评测结果

AC 100R30979237

posted @ 2020-02-23 23:56  dbxxx  阅读(283)  评论(0编辑  收藏  举报