题目描述
谢尔宾斯基三角形是一种分形,它的构造过程是这样的:
1.取一个实心的三角形。(多数使用等边三角形)
2.沿三边中点的连线,将它分成四个小三角形。
3.去掉中间的那一个小三角形。
4.对其余三个小三角形重复1。
我们想尝试用斜线、反斜线和下划线画出谢尔宾斯基三角,假设最小的三角是长这样的:
/\
/__\
1.取一个实心的三角形。(多数使用等边三角形)
2.沿三边中点的连线,将它分成四个小三角形。
3.去掉中间的那一个小三角形。
4.对其余三个小三角形重复1。
我们想尝试用斜线、反斜线和下划线画出谢尔宾斯基三角,假设最小的三角是长这样的:
/\
/__\
具体规律详见样例。
输入
多组数据输入输出。每行有一个整数n(1<=n<=10),表示执行了一次操作1,n=0时结束输入。
输出
画出执行n次操作1后的图形,调整你的输出到最左端(底边的第一个斜杠在第一列)。输出不能包含任何尾随空格。在每个测试用例后打印空行。
样例输入
3
2
1
0
样例输出
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
/\
/__\
/\ /\
/__\/__\
/\
/__\
思路:找规律,观察图形和输入n之间的关系,然后递归即可;
ps:赋值'\'必须写成'\\',类似%的输出规则;
代码:
#include <cstdio>
#include <cstring>
#define N 2050
using namespace std;
int n;
char s[N/2][N];
void print(int x,int y,int d){
int offset=1<<(d-1);
if(d==1){
s[x][y]=s[x+1][y-1]='/';
s[x][y+1]=s[x+1][y+2]='\\';
s[x+1][y]=s[x+1][y+1]='_';
return ;
}
print(x,y,d-1);
print(x+offset, y-offset, d-1);
print(x+offset, y+offset, d-1);
}
int main()
{
while(scanf("%d",&n) && n){
int i,j,k;
for(i=1;i<=(1<<n);i++)
for(j=1;j<=(1<<(n+1));j++)
s[i][j]=' ';
print(1,(1<<n),n);
k=(1<<n)+1;
for(i=1;i<=(1<<n);i++,k++){
for(j=1;j<=k;j++)
putchar(s[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}