• 超级圣诞树(BC115) 【题解】超详细


    前言

    这个题看了很久,没想出来,然后看了一些大佬的题解(可能是我的理解能力有些慢),中途有很多次放弃的想法,但是最终坚持着 ,研究明白了。

    所以想结合我的想法更加具体分享一下

     

    题目

    描述

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

    输入描述

    输入圣诞树的大小 n

    1 ≤  n ≤  8

    输出描述

    输出对应的圣诞树

    难度 中等

    题目链接  BC 115 超级圣诞树

    示例1

    输入:

    1
    

    输出:

      *
     * *
    * * *
      *
    
    

    说明:

     
    

    示例2

    输入:

    2

    输出:

         *
        * *
       * * *
      *     *
     * *   * *
    * * * * * *
         *
         *
    说明:
     
    

    示例3

    输入:

    3
    

    输出:

               *
              * *
             * * *
            *     *
           * *   * *
          * * * * * *
         *           *
        * *         * *
       * * *       * * *
      *     *     *     *
     * *   * *   * *   * *
    * * * * * * * * * * * *
               *
               *
               *
    
    

    说明:

     
    

     

    示例4 

    输入:

    4
    

    输出:

                           *
                          * *
                         * * *
                        *     *
                       * *   * *
                      * * * * * *
                     *           *
                    * *         * *
                   * * *       * * *
                  *     *     *     *
                 * *   * *   * *   * *
                * * * * * * * * * * * *
               *                       *
              * *                     * *
             * * *                   * * *
            *     *                 *     *
           * *   * *               * *   * *
          * * * * * *             * * * * * *
         *           *           *           *
        * *         * *         * *         * *
       * * *       * * *       * * *       * * *
      *     *     *     *     *     *     *     *
     * *   * *   * *   * *   * *   * *   * *   * *
    * * * * * * * * * * * * * * * * * * * * * * * *
                           *
                           *
                           *
                           *
    
    

    说明:

     
    

     

     

    解题的核心思想:  使用二维数组来进行存储图案 

     代码展示

     

    1. #include
    2. int main()
    3. {
    4. //使用二维数组存储圣诞树
    5. /*
    6. * 首先根据规律计算出 二维数组行和列的上限
    7. * //行的规律是 pow(2,(n-1))*3+n 当n == 8时 row = 392
    8. * //列的规律是 pow(2,n)*3 - 1 当n == 8时 col = 769
    9. * //所以进而确定行和列的取值范围
    10. */
    11. int n = 0;
    12. scanf("%d",&n);
    13. int arr[400][800] = {{0,0,1,0,0},{0,1,0,1,0},{1,0,1,0,1}};
    14. int i, j = 0, k, row = 3, col = 5;
    15. for (i = 2; i <= n; i++)//n>=2时才使用二维数组进行排(方便依次的递增)
    16. {
    17. //先进行复制
    18. for (j = row; j < row * 2; j++)
    19. {
    20. for (k = 0; k < col;k++)
    21. {
    22. arr[j][k] = arr[j - row][k];//复制为左下方的三角形
    23. arr[j][k + col + 1] = arr[j][k];//再把左下到复制的,也复制到右下
    24. }
    25. }
    26. //因为最开始的三角形是靠近最左的,清空后再重新置放到左下和右下的中间
    27. //先清空
    28. for (j = 0; j < row;j++)
    29. {
    30. for (k = 0; k < col;k++)
    31. {
    32. arr[j][k] = 0;
    33. }
    34. }
    35. //放到中央(这时需要我们把之前已经复制好的左下三角形复制到中央(当然右下也可以,左下比较方便))
    36. for (j = 0; j < row;j++)
    37. {
    38. for (k = (col+1)/2;k1)/2;k++) //这里的 /2 是为了放置于中间
    39. {
    40. arr[j][k] = arr[j + row][k-((col+1)/2)]; //左下复制到中间
    41. }
    42. }
    43. //根据规律和递归思想 ,该树的变化和2次方有关系
    44. row *= 2;
    45. col = col*2 +1;//这里的加1是方便为了中间放置三角形
    46. }
    47. for (i = 0; i < row; i++)
    48. {//打印圣诞树
    49. for (j = 0; j < col; j++)
    50. {
    51. if (arr[i][j] == 0)
    52. {
    53. printf(" ");
    54. }
    55. else
    56. {
    57. printf("*");
    58. }
    59. }
    60. printf("\n");
    61. }
    62. //打印树柄
    63. for (i = 0; i < n;i++)
    64. {
    65. for (j = 0; j < col / 2;j++)
    66. {
    67. printf(" ");
    68. }
    69. printf("*\n");
    70. }
    71. return 0;
    72. }

     

     题目解析超详细

    因为这里的思想是使用二维数组来进行存储图案,然后发现随着输入数字的增大,圣诞树也是有一定规律的增大,这里有点像递归的思想。发现图案是由 一个个3行5列的三角组成的

    接下来就进行一步一步来分析:

     

    第一步  因为圣诞树的大小为 1- 8,所以我们要考虑二维数组的取值范围 ,避免数组大小不够

     

    首先根据图案分析 他们的一次增长的行和列的规律,

    分析上述 得到结论  

    行数 与 n 的关系 

    列数与 n 的关系      

    这里我们取 n == 8    行数为 392,列数为 767

     

    所以为了避免越界我们取 二维数组的范围  arr[400][800]

    第二步 构造那个小三角  给二维数组部分初始化(先初始化一个小三角)【核心】

    int arr[400][800] = {{0,0,1,0,0},{0,1,0,1,0},{1,0,1,0,1}};

    初始时  3行  5列   

    int i, j = 0, k, row = 3, col = 5;

     然后等到打印的时候,数字0表示 " ",数字1表示 ”*“

    注意这里的起初三角就是 放在数组最左上方 ,因为根据组成指定的圣诞树,所以这里为了方便先进行 分别复制左下和右下边的三角形  ,然后 再把最左上那个三角形进行 想办法移动到中间。

     

    1.把左下角和右下角的三角形复制过去 

    1. //先进行复制
    2. for (j = row; j < row * 2; j++)
    3. {
    4. for (k = 0; k < col;k++)
    5. {
    6. arr[j][k] = arr[j - row][k];//复制为左下方的三角形
    7. arr[j][k + col + 1] = arr[j][k];//再把左下到复制的,也复制到右下
    8. }
    9. }

     

    图解

     

    2.把最左上的三角先清空(置0),然后再把其重新复制到中间

    1. //因为最开始的三角形是靠近最左的,清空后再重新置放到左下和右下的中间
    2. //先清空
    3. for (j = 0; j < row;j++)
    4. {
    5. for (k = 0; k < col;k++)
    6. {
    7. arr[j][k] = 0;
    8. }
    9. }
    10. //放到中央(这时需要我们把之前已经复制好的左下三角形复制到中央(当然右下也可以,左下比较方便))
    11. for (j = 0; j < row;j++)
    12. {
    13. for (k = (col+1)/2;k1)/2;k++) //这里的 /2 是为了放置于中间
    14. {
    15. arr[j][k] = arr[j + row][k-((col+1)/2)]; //左下复制到中间
    16. }
    17. }

     

     如图

     这就是所要打印的图案

    (当然必须是n>1)

     

     接着就是按照这样的思想,发现

     

    1. //根据规律和递归思想 ,该树的变化和2次方有关系
    2. row *= 2;
    3. col = col*2 +1;//这里的加1是方便为了中间放置三角形

    再以 为基准,当n = 3时 ,制作左下三角,制作右下三角

    总结就是这样每一次复制下去 

     然后把图形打印出来

    1. for (i = 0; i < row; i++)
    2. {//打印圣诞树
    3. for (j = 0; j < col; j++)
    4. {
    5. if (arr[i][j] == 0)
    6. {
    7. printf(" ");
    8. }
    9. else
    10. {
    11. printf("*");
    12. }
    13. }
    14. printf("\n");
    15. }

     

     第三步 打印树柄

    打印星号的位置就是在 列的 1/2 处打印

    1. //打印树柄
    2. for (i = 0; i < n;i++)
    3. {
    4. for (j = 0; j < col / 2;j++)
    5. {
    6. printf(" ");
    7. }
    8. printf("*\n");
    9. }

     

    最后 还是感谢网上大佬无私地分享题解,启发了我,虽然花费很久,但是收获也是很大的。 

     

     

    加油! 

  • 相关阅读:
    MySQL-Linux安装、卸载:
    nvm的安装及使用(入门级)
    卡奥斯第二届1024程序员节正式启动!
    浅谈AI人体姿态识别技术的先进性及安防视频监控应用场景
    14、Set 和 Map 数据结构
    【自然语言处理】BitNet b1.58:1bit LLM时代
    STM32F4XX - 系统定时器(SysTick)设置
    软信天成:构建主数据管理业务案例是实施主数据管理的关键
    Vue.js vs React:哪一个更适合你的项目?
    Spring Boot单元测试入门实战
  • 原文地址:https://blog.csdn.net/qq_72505850/article/details/133700256