题解 | #超级圣诞树#
超级圣诞树
https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423
#include <stdio.h>
#include <math.h>
#define row 600
#define col 400
void PrinTri(int arr[row][col],int height,int lenth) /*将数组某个范围的内容打印出来*/
{
int i = 0;
for (i = 0; i < height; i++)
{
int j = 0;
for (j = 0; j < lenth; j++)
{
if (0 == arr[i][j])
{
printf(" ");
}
else if (1 == arr[i][j])
{
printf("*");
}
}
printf("\n");
}
}
int main()
{
int arr[row][col] = { {0,0,1,0,0},{0,1,0,1,0},{1,0,1,0,1} };
int lenth = 5; /* 三角形起始长度为5 满足规律 lenth = 6 * 2 ^ (n - 1) - 1 */
int height = 3; /* 三角形起始长度为3 满足规律 height= 3 * 2 ^ (n - 1) */
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 2; i <=n; i++) /*n>2时才需要进行向下复制三角形的操作*/
{
int k = 0;
for (k = 0; k < height; k++) /*嵌套循环遍历第i-1阶三角形*/
{
int j = 0;
for (j = 0; j < lenth/2+k+1; j++) /*这里不写j<lenth是为了提高代码效率*/
{
arr[k + height][j] = arr[k][j]; /*本行代码实现了向下复制一个第i-1阶三角形*/
arr[k + height][j + lenth+1] = arr[k][j]; /*本行代码实现了向下并向右复制一个i-1阶三角形*/
}
}
for (k = 0; k < height; k++) /*删除height lenth范围中三角形(i-1阶三角形)的代码*/
{
int j = 0;
for (j = 0; j < lenth / 2 + k + 1; j++)
{
arr[k][j] = 0;
}
}
for (k = 0; k < height; k++) /*将i-1阶三角形复制到中间位置的代码*/
{
int j = 0;
for (j = 0; j < lenth / 2 + k + 1; j++)
{
arr[k][j + lenth / 2 + 1] = arr[k + height][j];
}
}
/*完成上述三个循环后第i阶的大三角就成型了*/
lenth = 6 * (int)pow(2, i - 1) - 1; /*复制完后调整操作范围准备下一次循环*/
height = 3 * (int)pow(2, i - 1); /*调整完后的范围就是第i阶大三角在二维数组中的存储范围*/
}
for (i = 0; i < n; i++) /*设置一下树干*/
{
arr[height + i][lenth / 2] = 1;
}
PrinTri(arr, height+n, lenth);
return 0;
}
