牛客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,那么牛客上两道打印圣诞树的题的就完成了,看完记得的自己动手试试瞧瞧代码哦

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

相关推荐
深邃-15 小时前
【数据结构与算法】-二叉树(2):实现顺序结构二叉树(堆的实现),向上调整算法,向下调整算法,堆排序,TOP-K问题
数据结构·算法·二叉树·排序算法·堆排序··top-k
We་ct18 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮1 天前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说1 天前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove1 天前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung1 天前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了1 天前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL1 天前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰1 天前
C++ 排列组合完整指南
开发语言·c++·算法