[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值