SCAU程序设计在线实训平台_编程进阶_新生赛题目_2019年初出茅庐_开门,你的圣诞礼物

开门,你的圣诞礼物(No.18598)

描述:

快要到圣诞节了,说到圣诞节首先让人想到圣诞老人和圣诞树。
实际上,圣诞节是为了庆祝耶稣的降生,但是这跟我们没有什么关系,有兴趣可以选修英语选修中讲述历史文化的圣经课。
所以圣诞节跟我们有什么关系呢,还是有关系的,steam平台上的绝大部分游戏会在这段时间打折。
为了迎接圣诞节的特大折扣,sen准备装饰n颗圣诞树,这些树的高度可能不相同。
但是sen太忙了,他还有很多屁事要做,他先想好了几个大概的种法,等你用程序画个图来看看最终结果是怎么样的。
圣诞树的画法如下:

高度为2的圣诞树:
   * 
  /-\
/-| |-\
  | |

高度为3的圣诞树:
     *
    /-\
  /-| |-\
/---| |---\
    | |

高度为4的圣诞树:
       *
      /-\
    /-| |-\
  /---| |---\
/-----| |-----\
      | |

高度为5的圣诞树:
         *
        /-\
      /-| |-\
    /---| |---\
  /-----| |-----\
/-------| |-------\
        | |

sen觉得你很聪明所以不用给出更多的例子,更高的高度以此类推就好了
圣诞树按给出的顺序种 每棵树之间用一个空格隔开

输入格式:

第一行输入t表示case数(1<=t<=100)
每个case第一行输入n表示有n颗圣诞树(1<=n<=5)
每个case第二行n个数字ai表示圣诞树的高度(2<=ai<=10)

输出格式:

对于每个case输出最终的样子
每个case之后需要加一个换行(因此最后一个case的末尾会多出两行)

输入样例:

2
2
4 2
3
4 2 3

输出样例:
       *
      /-\
    /-| |-\        *
  /---| |---\     /-\
/-----| |-----\ /-| |-\
      | |         | |

       *
      /-\                    *
    /-| |-\        *        /-\
  /---| |---\     /-\     /-| |-\
/-----| |-----\ /-| |-\ /---| |---\
      | |         | |       | |
提示:

这道题真是太简单了 如果你5分钟写出来 圣诞老人就会在2019圣诞节的晚上给你送礼物

代码实现(参考):
#include "stdio.h"

//打印n个空格
void printSpace(int n){
    for(int i=0; i<n; i++){
        printf(" ");
    }
}

//打印n个杠
void printGANG(int n){
    for(int i=0; i<n; i++){
        printf("-");
    }
}


//找最高的树
int findListMax(int treesnumber,int list[]){
    int max=0;

    for(int i=0; i<treesnumber; i++){
        if (list[i]>max){
            max=list[i];
        }
    }
    return max;
}


//打印一个Case
void printACase(int treesnumber,int treesHeightList[]){


    //最高的树的高度
    int highest = findListMax(treesnumber,treesHeightList);
    //printf("最高的树%d\n",highest);


    //打印树叶,逐行扫描
    for(int n=0;n<highest+1;n++){
        for (int i=0; i<treesnumber; i++){
            int h=treesHeightList[i];
            //printf("树高%d\n",h);

            //被该行切割的树
            if(h>highest-n){
                int Dvalue = h-highest+n;

                //如果被切的是没有树干那层
                if(Dvalue==1){
                    printSpace(h*2-2);
                    printf("/-\\");     //顶二层
                    printSpace(h*2-2);
                    printf(" ");
                }

                //如果切的是有树干的
                else{
                    printSpace((h-Dvalue)*2);
                    printf("/");
                    printGANG(2*Dvalue-3);      //打印杠
                    printf("| |");
                    printGANG(2*Dvalue-3);
                    printf("\\");
                    printSpace((h-Dvalue)*2);
                    printf(" ");                //两树间隔
                }
            }
            //如果被该行切割的是树顶
            else if(h==highest-n){
                printSpace(h*2-1);
                printf("*");        //树顶
                printSpace(h*2-1);
                printf(" ");        //两树间隔
            }

            //如果未被该行切割
            else if(h<highest-n){
                printSpace(h*4-1);
                printf(" ");        //两树间隔
            }
        }
    printf("\n");       //树叶部分打印完毕
    }


    //打印树干,底层
    for(int i=0;i<treesnumber;i++){
        int h=treesHeightList[i];
        printSpace(h*2-2);
        printf("| |");      //树干
        printSpace(h*2-2);
        printf(" ");        //两树间隔
    }
}

int main()
{
    int caseNumber;
    scanf("%d",&caseNumber);            //输入Case数
    int treesNumberList[caseNumber];    //每个Case中的树数
    int treesHeightList[caseNumber][5]; //树数对应高度

    //逐个Case处理
    for (int i=0; i<caseNumber; i++){

        scanf("%d",&treesNumberList[i]);    //输入树的个数

        //逐个树对于高度处理
        for (int j=0; j<treesNumberList[i]; j++){
           scanf("%d",&treesHeightList[i][j]);      //输入树的高度数组

        }
    }
    for (int i=0; i<caseNumber; i++){
        //第i个Case中的树数
        int treenumber=treesNumberList[i];
        int treesHeights[treenumber];

        //二维数组中的一行转换为一维数组
        for(int j=0;j<treenumber;j++){
            treesHeights[j]=treesHeightList[i][j];
        }
        printACase(treesNumberList[i],treesHeights);    //打印一个Case
        printf("\n");     //一个Case打印完毕
        printf("\n");     //加一个换行
    }

}

感想:

今天高程实验课做完堂测以后,因为考试限制,实验入口关闭了,于是想随便找点题做做。觉得这道题很有意思就开始做了,刚开始觉得这不就是打印菱形升级版吗。啪啦啪啦一顿写,写完以后才发现,这道题的精髓在于它的圣诞树是横着种的= =,当时人直接傻了,时间也差不多了,于是保存了一下文件就去吃饭了。

吃完饭本来是有任务做的,结果器材没在身边。就想着要不把这道题做完吧,就一直写,加上规范代码写注释大概花了3-4小时,巨慢好吧。不过还是很有成就感的,毕竟第一次在OJ上写出100+行的代码。我总感觉有更简单的方法,但是想不出来qwq。就硬着头皮写完了,有些变量名拼写甚至都错了- -。大家看看就好,献丑了,欢迎一起讨论哈(想看到大佬们简单的解法)。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值