牛客BC115 超级圣诞树

万众瞩目

在上一篇我们介绍了一个圣诞树的打印,而这道题与上次不同的是他的基本单位是一直在变的

我建议先把上一个搞懂在写这道题这个。

牛客网BC114 圣诞树-CSDN博客

ok那么正文开始

题目如下

今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。

输入描述:

输入圣诞树的大小为n

1≤n≤8

输出描述:

输出对应的圣诞树

样例一:

复制代码
输入:1
输出:
  *
 * *
* * *
  *

样例二:

复制代码
输入:2
输出:
     *
    * *
   * * *
  *     *
 * *   * *
* * * * * *
     *
     *

样例三:

复制代码
输入:3
输出:
           *
          * *
         * * *
        *     *
       * *   * *
      * * * * * *
     *           *
    * *         * *
   * * *       * * *
  *     *     *     *
 * *   * *   * *   * *
* * * * * * * * * * * *
           *
           *
           *

样例四:

复制代码
输入:4
输出:
                       *
                      * *
                     * * *
                    *     *
                   * *   * *
                  * * * * * *
                 *           *
                * *         * *
               * * *       * * *
              *     *     *     *
             * *   * *   * *   * *
            * * * * * * * * * * * *
           *                       *
          * *                     * *
         * * *                   * * *
        *     *                 *     *
       * *   * *               * *   * *
      * * * * * *             * * * * * *
     *           *           *           *
    * *         * *         * *         * *
   * * *       * * *       * * *       * * *
  *     *     *     *     *     *     *     *
 * *   * *   * *   * *   * *   * *   * *   * *
* * * * * * * * * * * * * * * * * * * * * * * *
                       *
                       *
                       *
                       *

代码解析:

1.与上次相比我们的基本单位是一直变化的,也就是输入不同的数字,我们要先找到这个基本单位才行

2.可以发现输入n对应的基本单位就是n-1对应的图,所以可以先用循环找到基本单位

3.再找基本单位后要多次使用它,所以要先把基本单位存起来方便使用,我用的方法是二维数组。

ok有了以上的基本思路就可以开始敲代码了。

注意:一个基本变量变为下一个基本变量的过程如下

一.找基本单位

复制代码
    int row = 3, column = 6;//基本单位的行列
    int arr[100][200] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };//存一个最小的基本变量
    int count;
    scanf("%d", &count);
    for (int i = 1; i < count; i++)//我们知道输入n对应的图形其实也是n+1的基本单位所以我这个循环可以直接得到我们要找的图形
    {
        for (int j = row, J = 0; j < 2 * row; j++, J++)
            for (int k = 0; k < column; k++)
            {
                arr[j][k] = arr[J][k];//这个是左下
                arr[j][k + column] = arr[J][k];//这个是右下
                arr[J][k] = '\0';这个是消除原本储存的基本单位,
            }
//可以发现n的基本单位是由三个n-1的基本单位构成的,分别位于左上,右下,中上
        for (int j = 0, J = row; j < row; j++, J++)
        {
            for (int k = 0; k < column; k++)
                arr[j][k + column / 2] = arr[J][k];//这个是中上
        }
        row *= 2;//基本单位变大,记录的行列也要变化
        column *= 2;
    }

二.打印树

二维数组存储了我们的目标图形,直接打印,但要注意,我们要把数组对应元素是'\0'的打印为空格,不然你的图形就会缺一块少一块的,我的处理方法是个三目操作符来判断。

复制代码
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
            printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);
        printf("\n");
    }

三.打印树根

打印树根就简单了,只要直到树根在中间就行。

复制代码
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < column / 2 - 1; j++)
            printf(" ");
        printf("*\n");
    }

答案如下

复制代码
#include<stdio.h>
int main()
{
    int row = 3, column = 6;
    int arr[400][1000] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };
    int count;
    scanf("%d", &count);
    for (int i = 1; i < count; i++)
    {
        for (int j = row, J = 0; j < 2 * row; j++, J++)
            for (int k = 0; k < column; k++)
            {
                arr[j][k] = arr[J][k];
                arr[j][k + column] = arr[J][k];
                arr[J][k] = '\0';
            }
        for (int j = 0, J = row; j < row; j++, J++)
        {
            for (int k = 0; k < column; k++)
                arr[j][k + column / 2] = arr[J][k];
        }
        row *= 2;
        column *= 2;
    }
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
            printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);
        printf("\n");
    }
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < column / 2 - 1; j++)
            printf(" ");
        printf("*\n");
    }
    return 0;
}

但是!!!!!!!

这个写法有个问题是

由于我们把要打印的n对应的图形存了进去使得内存消耗很大,下图牛客上给的

所以我们还有一种思路,就是找到n的基本单位,然后用类似于上一道题(就上一篇博客)的方法写出来

解析写在注释里了

复制代码
#include<stdio.h>
int main()
{
    int row = 3, column = 6;
    int arr[200][400] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };
    int count;
    scanf("%d", &count);
    if (count > 1)
    {
        for (int i = 1; i < count - 1; i++)//这里是count-1说明找的是n的基本单位,而不是n本身
        {
            for (int j = row, J = 0; j < 2 * row; j++, J++)
                for (int k = 0; k < column; k++)
                {
                    arr[j][k] = arr[J][k];
                    arr[j][k + column] = arr[J][k];
                    arr[J][k] = '\0';
                }
            for (int j = 0, J = row; j < row; j++, J++)
            {
                for (int k = 0; k < column; k++)
                    arr[j][k + column / 2] = arr[J][k];
            }
            row *= 2;
            column *= 2;
        }
//这些找基本单位过程与上一个方法一样,
        for (int I = 0; I < row; I++)
        {
            for (int i = 0; i < column / 2; i++)
                printf(" ");
            for (int i = 0; i < column; i++)
                printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
            printf("\n");
        }
//可以发现要打印的图形都可以分为上下两部分
//这个是上面的,需要先打空格
        for (int I = 0; I < row; I++)
        {
            for (int i = 0; i < column; i++)
                printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
            for (int i = 0; i < column; i++)
                printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
            printf("\n");
        }
//这个是下面的两个基本单位构成的,不用先打空格,而且由于是两个,所以里面放了两个for循环
        for (int i = 0; i < count; i++)
        {
            for (int j = 0; j < column - 1; j++)
                printf(" ");
            printf("*\n");
        }
//打印树根
    }
    else//此方法需要将n=1设置为特例,因为找不到他的基本单位
        printf("  *\n * * \n* * *\n  *");
    return 0;
}

很明显占用内存小了很多

总结

ok,那么牛客上两道打印圣诞树的题的就完成了,看完记得的自己动手试试瞧瞧代码哦

感觉有用的话就点个赞支持一下吧,谢谢啦

相关推荐
励志要当大牛的小白菜2 小时前
ART配对软件使用
开发语言·c++·qt·算法
qq_513970443 小时前
力扣 hot100 Day56
算法·leetcode
PAK向日葵3 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子5 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
爱喝矿泉水的猛男6 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao6 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
YouQian7726 小时前
Traffic Lights set的使用
算法
快乐飒男7 小时前
哈希表(c语言)
c语言·哈希算法·散列表
go54631584658 小时前
基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
图像处理·人工智能·深度学习·神经网络·算法
aramae8 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法