题解 | #超级圣诞树#

超级圣诞树

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

#include <stdio.h>
#include <math.h>

int main() {
    int n, i, j;
    scanf("%d", &n);

    int a = pow(2, n - 1) * 3; // 计算树的主体高度

    int width = 2 * a - 1;     // 树的总宽度 `width`

    char chs[a + n][width];    // a + n 行用于容纳树的主体和树干

    // 初始化字符数组为空格,填充整个二维数组
    for (i = 0; i < a + n; i++) {
        for (j = 0; j < width; j++) {
            chs[i][j] = ' ';
        }
    }

    // 绘制初始的基础三角形
    chs[0][a - 1] = '*';
    chs[1][a - 2] = chs[1][a] = '*';
    chs[2][a - 3] = chs[2][a - 1] = chs[2][a + 1] = '*';

    // 递归生成更大的三角形
    int h = 3;                        // 初始高度 `h` 设置为3,对应基础三角形的高度
    while (h < a) {                   // 当高度小于 `a` 时循环,递归构建更大的三角形
        for (i = 0; i < h; i++) {     // 遍历当前高度的每一行
            // a - 1 是三角形的中心位置,通过 a - 1 - i 和 a - 1 + i 控制每一行的左右边界。
            for (j = a - 1 - i; j <= a - 1 + i; j++) {
                chs[i + h][j - h] = chs[i][j]; // 将当前行的星号区域复制到左下方
                chs[i + h][j + h] = chs[i][j]; // 将当前行的星号区域复制到右下方
            }
        }
        h *= 2;                       // 将高度 `h` 翻倍,继续递归构建更大的三角形
    }

    // 绘制树干
    for (i = a; i < a + n; i++) {
        chs[i][a - 1] = '*';
    }

    // 遍历字符数组输出结果
    for (i = 0; i < a + n; i++) {
        for (j = 0; j < width; j++) {
            printf("%c", chs[i][j]);
        }
        printf("\n");
    }

    return 0;
}

全部评论

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务