首页 > 其他 > 详细

[luogu p1498] 南蛮图腾

时间:2020-02-24 00:59:08      阅读:130      评论:0      收藏:0      [点我收藏+]

传送门

题面

题目描述

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

输入输出格式

每个数据一个数字,表示图腾的大小(此大小非彼大小) 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

[luogu p1498] 南蛮图腾

原文:https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p1498.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!