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("\n");
    }
    //为了不在最后多输出一个换行
        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;
}

posted @ 2020-07-30 12:10  Zforw  阅读(80)  评论(0编辑  收藏  举报