题解 | 超级圣诞树
超级圣诞树
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;
}
