开门,你的圣诞礼物(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。就硬着头皮写完了,有些变量名拼写甚至都错了- -。大家看看就好,献丑了,欢迎一起讨论哈(想看到大佬们简单的解法)。