【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印

【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印_第1张图片

上面是圣诞树的大致形状

 用代码实现出来是这样的

【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印_第2张图片

该想法的来源是牛客网的一道题目

【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印_第3张图片

当然只要爱足够多

你的圣诞树(爱)可以溢出屏幕,哈哈


那么我们以 

【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印_第4张图片

为例子,也就对应题目里的h=2来详细讲解


首先我们注意到,h最大可以取到100,也就是这么庞大的圣诞树一定要用循环+找规律实现

我的第一反应 是数组,先从一小颗圣诞树实现

但是显然这个问题的特点在于空格的打印,而用数组初始化之后打印“你就慢了”

之所以特点在空格

是我们发现h=1的时候除去底部的树干,整个树枝是对称的

*注:

【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印_第5张图片

h=1(如图),我们称这个最基本的单元(不包含树干)为小圣诞树

我们完全可以从每一层(一共三层)把树枝分成    一堆空格+*的安排     两部分

那么我们首先实现空格这个问题

现在观察h=2,因为只有一个小圣诞树(h=1)是发现不了当层数变多时候的规律的

注意到  当图片中j=1时  也就是小圣诞树第一层,前面应该有5个空格

和j=4时的小圣诞树的第一层,中间隔了3个格子,也就是 如果设置一个变量,用他表示小圣诞树第一层的空格数,每次循环之后应该+=3

但是换个角度思考,可以让他每次++,但条件是0< <3*h-j  或者是从1开始到3*h-j+1

(这里比较抽象,需要带入h=2,好好想一下逻辑)

为什么不采用+=3的方法,因为这样知识分析了第一层的空格情况,但是用0~3*h-j就完美解决了小圣诞树1~3层的所有空格问题

剩下的就是*的安排

这个部分是根据每一层的不同特点具体安排的,绝对不能向空格一样一概而论

基于上述的+=3思想

由于我们从图片列数是1开始分析的,而不是从上至下,所以是-=3

所以代码如下

//打印圣诞树
int main()
{
    int h = 0;
    scanf("%d", &h);
    for (int j = 1; j <= 3 * h; j++)
    {
        for (int m = 0; m < 3 * h-j; m++)
            printf(" ");               //全局空格的打印,和后面所有打印空格的代码二选一
        if (j % 3 == 1)
        {
           // for (int m = j; m < 3 * h; m++)
             //   printf(" ");        //一个空格
            for (int p = j; p > 0; p -= 3)
                printf("*     ");   //5个空格
            printf("\n");
        }
        if (j % 3 == 2)
        {
           // for (int c = j; c < 3 * h; c++)
            //    printf(" ");          //一个空格
            for (int p = j; p > 0; p -= 3)
                printf("* *   ");     //三个空格
            printf("\n");
        }
        if (j % 3 == 0)
        {
           // for (int m = j; m < 3 * h; m++)
             //   printf(" ");
            for (int c = j; c > 0; c -= 3)
                printf("* * * ");      //末尾一个空格,相邻之间一个
            printf("\n");
        }
    }
    for (int l = 1; l <= h; l++)
    {
        for (int c = 1; c <= 3* h +1; c++)
        {
            if (c == 3 * h)
                printf("*");
            else
                printf(" ");        //一个空格
        }
        printf("\n");
    }
}

方法不唯一,但是个人以为这样比较容易思考和实现

创作不易,感谢观看 

你可能感兴趣的:(圣诞树,和tt学C,c++,c#)