题解 | #超级圣诞树#
超级圣诞树
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++刷题的题解思路