题解 | #超级圣诞树#
超级圣诞树
https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423
//对于小白来说,是真滴难~,只能仿造大佬的思路来写
#include <stdio.h>
#include <math.h>
int main() {
int a = 0;
while (~scanf("%d", &a))
{
char arr[800][800]={0};
int top_y = 3*pow(2,a-1)-1;//确定顶点*的位置
arr[0][top_y] = '*';
arr[1][top_y-1] = '*';
arr[1][top_y+1] = '*';
arr[2][top_y-2] = '*';
arr[2][top_y] = '*';
arr[2][top_y+2] = '*';//每次进来,先确定一个小树,接着就是要复制小树
//将小树复制到该小树的左下角和右下角,复制完之后整体又当作一个树
//接着再将该整体树又复制到该整体树的左下角和右下角,就这样一直循环下去
int i = 0;
//先进行复制
for (i = 1; i < a; i++)//复制次数。已经确定了一个小树,复制次数要比输入的数字少1
{
int range = 3*pow(2,i-1)-1;//每次要复制的树是几层,层数从0开始计数,因为数组是从0开始
int x = 0;
for(x=0; x<=range; x++)//需要复制的层数
{
int y = 0;
for(y=top_y-range; y<=top_y+range; y++)//每一层复制多少次
{
arr[x+range+1][y-range-1]=arr[x][y];//复制到左边,从小树左下角的第一个*先复制
arr[x+range+1][y+range+1]=arr[x][y];//复制到右边,从小树左下脚的第一个*先复制
}
}
}
//开始打印树
for(i=0; i<=3*pow(2,a-1)-1; i++)
{
int j = 0;
for(j=0; j<=3*pow(2,a)-2; j++)
{
if(arr[i][j]=='*')
{
printf("%c",arr[i][j]);
}
else
{
printf(" ");
}
}
printf("\n");
}
//打印树干
for(i=0; i<a; i++)
{
int j = 0;
for(j=0; j<3*pow(2,a-1)-1; j++)
{
printf(" ");
}
printf("*\n");
}
}
return 0;
}
