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;
    }
    
    
    岂能尽如人意,但求无愧我心
  • 相关阅读:
    多项式 ln exp
    动态点分治复习
    生成函数与多项式基础
    长链剖分学习笔记
    半平面交复习
    Maven的SSM框架配置文件:
    Linux(CentOs)之安装Redis及注意事项
    Scala:scala的一些简单操作命令
    Maven:如何在eclipse里新建一个Maven的java项目和web项目
    Maven:Eclipse上Maven的配置
  • 原文地址:https://www.cnblogs.com/Zforw/p/13403037.html
Copyright © 2011-2022 走看看