• Luogu P1498南蛮图腾


    传送门
    谢尔宾斯基三角形

    可以看出每个三角形非常有规律。我们可以把一个大的三角形(n)看成三个次大的三角形(n - 1),问题就变成了分别画出三个位置不同但大小相同的n-1三角形,如此递归下去。
    由于每个的三角形都是由若干个最小的三角形组成(n = 1),所以n = 1时直接很容易画出,其余情况递归即可。关于位置可以找规律(2的多少次方)

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int n;
    const int pow[11] = {0,2,4,8,16,32,64,128,256,512,1024};
    int ans[2000][2000];
    void draw(int r,int c,int k){
    	//以r行c列作为小三角形上边的斜杠的位置('/')
        //这里用字符的ascii码来存下对应的字符
        if(k == 1){
            ans[r][c] = ans[r+1][c-1] = 47;
            ans[r][c+1] = ans[r+1][c+2] = 92;
            ans[r+1][c] = ans[r+1][c+1] = 95;
        }
        else{
            draw(r,c,k-1);
            draw(r+pow[k-1],c-pow[k-1],k-1);
            draw(r+pow[k-1],c+pow[k-1],k-1);
        }
    }
    int main(){
        memset(ans,sizeof(ans),0);
        scanf("%d",&n);
        if(n == 1){
            cout<<" /\"<<endl<<"/__\";//字符的转义:\
        }
        else{
            draw(1,pow[n],n);
        for(int i = 1;i < pow[n];++i){
        	//避免在后多输出空格
            for(int j = 1;j <= pow[n+1] + i + 1;++j){
                if(ans[i][j] == 0) printf(" ");
                else printf("%c",char(ans[i][j]));
            }
            printf("
    ");
        }
        //为了不在最后多输出一个换行
            for(int j = 1;j <= pow[n+1];++j){
                if(ans[pow[n]][j] == 0) printf(" ");
                else printf("%c",char(ans[pow[n]][j]));
            }
        }
        return 0;
    }
    
    
    岂能尽如人意,但求无愧我心
  • 相关阅读:
    三级菜单打怪升级,young -> plus -> pro
    Python注释是什么东东
    腾讯云中的mysql镜像数据定时同步到本机数据库
    linux重复命令的简洁化
    快速查询mysql中每个表的数据量
    MGR与MHA
    mysql基础练习
    mongo日常操作备忘
    MongoDB:删除操作
    MongoDB插入数据的3种方法
  • 原文地址:https://www.cnblogs.com/Zforw/p/13403037.html
Copyright © 2020-2023  润新知