题解 | #超级圣诞树#

超级圣诞树

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;
}

全部评论

相关推荐

11-23 15:14
中原工学院 Java
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

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