题解 | #超级圣诞树#

超级圣诞树

https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423

没想出来,参考@在攒经验的螺狮粉很内向大佬的求解思路改成了C++版本,就是套娃。要考虑的还是比较多的,在VSCode跑了一下,理解了思路,后面有时间再做一遍吧。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int main() {
    int n;
    while (cin >> n)
    {
        int lastPW = pow(2, n - 1) * 6; // 最底层宽度
        int leftW = (lastPW - 6) / 2;   // 左边宽 每三层-3
        int allP = 3 * pow(2, n - 1);   // 去除杆子的总层数
        int checkN = 1;                 // 检测n,每个n对应的层数
        int starW = 0;                  // 左右两边间距,注意这里间距要和下面代码的putStr对应着看才好理解。
        int starP = 0;                  // 统计每新的开始输出几层了
        string treeData[allP + n];      // 树
        for (int i = 1; i <= allP; i++)
        {
            for (int j = 0; j < leftW; j++)
            cout << " "; // 输出左边宽
            if (i < 4)
            { // 相当于一个初始化的过程
            string putStr = "";
            if (i == 1)
            {
                // "  *   "
                putStr = "  *   ";
            }
            else if (i == 2)
            {
                // " * *  "
                putStr = " * *  ";
            }
            else
            {
                // "* * * "
                putStr = "* * * ";
            }
            treeData[i - 1] = putStr;
            cout << putStr;
            }
            else
            { // 开始输出前者的内容
            string putStr;
            for (int j = 0; j < 2; j++)
            { // 左右
                putStr = putStr + treeData[starP];
                if (j == 0)
                {
                // 有间距的时候需要输出间距
                for (int k = 0; k < starW; k++)
                {
                    putStr = putStr + " ";
                }
                }
            }
            cout << putStr;
            treeData[i - 1] = putStr;
            }

            starP++;
            if (i % 3 == 0)
            { // 每三层,左边宽度-3,左右两边树的间距-6
            leftW -= 3;
            starW -= 6;
            }
            // 根据checkN知道当前输出是否到达每个n所处的输出范围
            if ((int)pow(2, checkN - 1) * 3 == i)
            {
            checkN++;
            starP = 0; // 每个n(checkN),就是新的开始
            if (checkN > 2)
            {
                starW = (int)pow(2, checkN - 2) * 6 - 6; // 当第三层的时候左右两边树的间距计算
            }
            }
            cout << endl;
        }

        // 杆子
        int leftTW = (lastPW / 2) - 1;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < leftTW; j++)
            {
            cout << " ";
            }
            cout << "*" << endl;
        }
    }
}
C++题解 文章被收录于专栏

记录在牛客网用C++刷题的题解思路

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务