牛客BC115 超级圣诞树

发布时间:2023年12月20日

万众瞩目

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

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

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

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

文章来源:https://blog.csdn.net/2301_79551553/article/details/135111662
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。