传送门
谢尔宾斯基三角形
可以看出每个三角形非常有规律。我们可以把一个大的三角形(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;
}