2017图灵杯问题D 简单的图形输出(dfs)

来源:互联网 发布:导购网站源码 下载 编辑:程序博客网 时间:2024/06/11 15:46

题目描述

谢尔宾斯基三角形是一种分形,它的构造过程是这样的:
1.取一个实心的三角形。(多数使用等边三角形)
2.沿三边中点的连线,将它分成四个小三角形。
3.去掉中间的那一个小三角形。
4.对其余三个小三角形重复1。
我们想尝试用斜线、反斜线和下划线画出谢尔宾斯基三角,假设最小的三角是长这样的:
  /\
/__\
具体规律详见样例。

输入

多组数据输入输出。每行有一个整数n(1<=n<=10),表示执行了一次操作1,n=0时结束输入。

输出

画出执行n次操作1后的图形,调整你的输出到最左端(底边的第一个斜杠在第一列)。输出不能包含任何尾随空格。在每个测试用例后打印空行。

样例输入

3210

样例输出

       /\      /__\     /\  /\    /__\/__\   /\      /\  /__\    /__\ /\  /\  /\  /\/__\/__\/__\/__\   /\  /__\ /\  /\/__\/__\ /\/__\


思路:找规律,观察图形和输入n之间的关系,然后递归即可;


ps:赋值'\'必须写成'\\',类似%的输出规则;


代码:

#include <cstdio>#include <cstring>#define N 2050using 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;}


原创粉丝点击