Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198263
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-07-24 13:35:05

解题思路:
先打表,然后根据具体的输入截取相应的表的右下部分,在画图的过程中最重要的就是选准参考点,然后通过计算偏移量定位每个递归部分的框架。

 

 

 

/

\

 

 

 

 

 

/

_

_

\

 

 

 

/

\

 

/

 

\

 

/

_

_

_

_

_

_

\

 

#include<stdio.h>
#include<string.h>
#include<math.h>

const int MAX=1024;

char mat[MAX+1][MAX*2+2];

void draw(int x,int y,int depth)
{
    if(depth==1)     //基本的三角形
    {
        mat[x][y]='/';mat[x][y+1]='\\';
        mat[x+1][y-1]='/';mat[x+1][y+2]='\\';
        mat[x+1][y]='_';mat[x+1][y+1]='_';
        return ;
    }

    int offset=(int)pow((double)2,(double)(depth-1));
    
    draw(x,y,depth-1);        //递归分割三角形
    draw(x+offset,y-offset,depth-1);
    draw(x+offset,y+offset,depth-1);
}

int main()
{
    memset(mat,' ',sizeof(mat));
    draw(1,MAX,10);
    for(int i=1;i<=MAX;i++)   //终止行的输出
    {
        mat[i][MAX+1+i]='\0';
    }

    int n;
    while(scanf("%d",&n),n)
    {
        int startX=MAX-(int)pow((double)2,(double)n)+1;
        int startY=MAX*2-(int)pow((double)2,(double)(n+1))+1;

        for(int i=startX;i<=MAX;i++)
        {
            printf("%s\n",&mat[i][startY]);
        }
        printf("\n");
    }
    return 0;
}


阅读(1057) | 评论(0) | 转发(0) |
0

上一篇:循环赛日程表

下一篇:pku3768 Repeater

给主人留下些什么吧!~~