zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    岂能尽如人意,但求无愧我心
  • 相关阅读:
    二十三种设计模式 python实现
    python logging的输出
    redis
    Django1.11序列化与反序列化
    Django1.11基础视图
    Django1.11模型类数据库操作
    Django1.11创建
    泛型全面分析和应用(二)
    泛型全面分析和应用(一)
    注解的基本盘点 -- 《Java编程思想》
  • 原文地址:https://www.cnblogs.com/Zforw/p/13403037.html
Copyright © 2011-2022 走看看