题解 | 超级圣诞树

超级圣诞树

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

//运用递归的方法,类似与数列的递推
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MAX_SIZE 1024

char canvas[MAX_SIZE][MAX_SIZE * 2];

// 递归绘制圣诞树
void draw(int x, int y, int size, int level)
{
  //以顶点绘制最小单元  *
  //                  * *
  //                 * * *       x y为顶点,行和列
    if (level == 0)
    {
        for (int i = 0; i < size; i++)//这个地方只能用size是因为在一次次递归中size都会被/2,且最小的三角形也只与size大小有关
        {
            for (int j = -i; j <= i; j = j + 2)
            {
                canvas[x + i][y + j] = '*';
            }
        }
    }
  //很关键的一步:进行函数中的嵌套,即套娃,每一次的draw都会一直执行到level==0
    else {
        int newsize = size / 2;
        draw(x, y, newsize, level - 1);//绘制顶点处
        draw(x+newsize, y-newsize, newsize, level - 1);//绘制左下角
        draw(x+newsize, y+newsize, newsize, level - 1);//绘制右下角
    }
}

int main() {
    int n;
    scanf("%d", &n);
    // 计算画布大小
    int height = 3*pow(2, n-1);  // 高度为2^n
    int width = 2 * height;  // 宽度确保能完整显示

    // 初始化画布
    memset(canvas, ' ', sizeof(canvas));

    // 从顶部中间开始绘制
    draw(0, height - 1, width/2, n - 1);

    // 输出结果
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            printf("%c", canvas[i][j]);
        }
        printf("\n");
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < width / 2 - 1; j++) {
            printf(" ");
        }
        printf("*\n");
    }
    return 0;
}

全部评论
点赞 回复 分享
发布于 10-15 18:05 四川

相关推荐

11-13 14:37
门头沟学院 Java
点赞 评论 收藏
分享
影04714:把图书管理系统那个项目经验内容适当的减少掉,然后改成据为己有不要说团队项目,因为图书管理系统这类常见的谁来了都能独立写出来,提问能圆过来即可
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务