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

题目描述

谢尔宾斯基三角形是一种分形,它的构造过程是这样的:
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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值