题解 | #超级圣诞树#

超级圣诞树

https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423

//使用递归,将大的三角拆分成3个小的三角,直至拆成最小的一个三角
#include <stdio.h>
#include <math.h>
//将"*"存放于一个800*400的数组中,以1代表"*"、0代表" ",生成三角形时初始化为1
int arr[800][400]={0};  //数组最大需要宽为3*2的8次(768),高为3*2的7次(384)
//此处使用递归生成三角形部分
void create(int x,int y,int n)//(x,y)为起始坐标,n为三角形的大小
{
   if (n>1)//一个大的三角由三个小一号的三角构成
   {   
        //生成上面的三角
        create(x,y,n-1);
        //生成左下角的三角
        create(x-3*pow(2,n-2),y-3*pow(2,n-2),n-1);//此处三角形x、y每次改变的值须由n求得
        //生成右下角的三角
        create(x+3*pow(2,n-2),y-3*pow(2,n-2),n-1);//直接由x、y的值求是错误的
   }
   else //生成一个最小的三角
   {
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=-i;j<i+1;j+=2)
        {
            arr[x+j][y-i]=1;
        }
    }
   }
}
int main() 
{
    int i,j,n;  
    while (scanf("%d",&n) != EOF)
    {  
        //生成一个顶点在(3*pow(2,n-1),3*pow(2,n-1),大小为n的三角
        create(3*pow(2,n-1),3*pow(2,n-1),n);   
        //把生成的三角形打印出来作为树叶部分
        for(i=3*pow(2,n-1);i>0;i--)//三角形有3*pow(2,n-1)层
        {           
            for(j=1;j<3*pow(2,n);j++)//每一层有3*pow(2,n)个
            {
                if (arr[j][i]==1)
                printf("*");
                else
                printf(" ");
            } 
            printf("\n"); //一层打印完成换行                    
        }
        //打印树干部分
        for(i=0;i<n;i++)
        {
           for(j=0;j<3*pow(2,n-1)-1;j++)//大小为n时"*"前需要3*pow(2,n-1)-1个空格
            {
                printf(" ");
            }
            printf("*\n");   
        }              
    }
    return 0;
}

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务