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

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

相关推荐
山北雨夜漫步40 分钟前
机器学习 Day14 XGboost(极端梯度提升树)算法
人工智能·算法·机器学习
到底怎么取名字不会重复42 分钟前
Day10——LeetCode15&560
c++·算法·leetcode·哈希算法·散列表
chuxinweihui1 小时前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
周而复始 否极泰来1 小时前
深入浅出学会函数(上)
c语言·学习
freexyn1 小时前
Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
笔记·算法·matlab
陈大大陈2 小时前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存
看到我,请让我去学习2 小时前
C语言基础(day0424)
c语言·开发语言·数据结构
数据分析螺丝钉2 小时前
LeetCode 252 会议室 III(Meeting Rooms III)题解与模拟面试
算法·leetcode·职场和发展
小李独爱秋2 小时前
动态哈希映射深度指南:从基础到高阶实现与优化
数据结构·算法·哈希算法
猫猫头有亿点炸2 小时前
C语言斐波拉契数列2.0
c语言·开发语言·算法