前言:这篇文章是我在牛客网刷题过程(打印圣诞树🎄图案)中遇到的较为难做的一道(对如今的我而言哈),特在此发表一下自己的理解,希望能给对这道题目有疑惑的人一些帮助。
1. 题目
这是牛客网编程初学者入门训练的一道题目
大家没做的可以先去做一做,题目如下
2. 详细解答
简述:这道题的重点是分析圣诞树的图案,题目中给出了h=1~3时圣诞树的图案,而我们需要从这这三个图案中提取出一些关键的信息。当然,图案越丰富关键信息越多,所以这道题的突破重点就是h=3时的图案,同时在分析图案三时要结合图二与图一,使得图三中提取出的条件同样满足二者.
分析:具体分析图案三,结合图一图二可以得到以下的一些规律
(1) 输入h后,每颗圣诞树的树体都有 row = 3 * h 行
(2) 每一行前的空格个数依次为8,7,6,5,...,0,从而得到这个有关的一个规律:即各行i对应的空格数 k = row - i
(3) 打印出的各行*号与空格的具体信息,我们直接见图分析
在完成(3)规律的寻找后,我们就可以完成该树体程序的大致框架了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h = 0;
scanf("%d", &h);
int i = 0;
int j = 0;
int row = 3 * h;
for (i = 1;i <= row;i++) //打印row行的树体
{
for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
{
printf(" ");
}
if (i % 3 == 1) //打印一颗星
{
}
else if (i % 3 == 2) //打印两颗星
{
}
else //打印三颗星
{
}
}
return 0;
}
(4) 接下来就是该程序最大的难点了,就是如何实现各个相似过程的循环,由分析可知相似有三:
1. 打印 1 个 * 5个空格(* )------1,4,7...行
2. 打印 1 个 * 1个空格 1个 * 3个空格(* * )------ 2,5,8...行
3. 打印1 个 * 1 个空格 1 个 * 1 个空格 1 个 * 个 1 空格 (* * * )------ 3,6,9...行
而分析各个数字与可以得出相关规律:
1. 数字 1,4,7,10,13在表达式(i / 3 + i % 3)中可以得到数字1,对应一次循环次数
2. 同样的,数字 2,5,8,11,14在表达式((i-1) / 3 + (i-1) % 3)中可以得到数字2,对应两次循环次数
3. 如法炮制,数字 3,6,9,12,15在表达式((i-2) / 3 + (i-2) % 3) 中可以得到数字3,对应三次循环次数
分析好这三步,这个程序也就结束了,其实也不难,只要想到了 1. 其他两个就简单了,我们会觉得难也是做题比较少。所以,xdm,冲冲冲!!!
这样就可以把整个树体程序补充完了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h = 0;
scanf("%d", &h);
int i = 0;
int j = 0;
int row = 3 * h;
for (i = 1;i <= row;i++) //打印row行的树体
{
for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
{
printf(" ");
}
if (i % 3 == 1) //打印一颗星
{
for (j = 0;j < i / 3 + i % 3;j++)
{
printf("* ");
}
printf("\n");
}
else if (i % 3 == 2) //打印两颗星
{
for (j = 0;j < (i - 1) / 3 + (i - 1) % 3;j++)
{
printf("* * ");
}
printf("\n");
}
else //打印三颗星
{
for (j = 0;j < (i - 2) / 3 + (i - 2) % 3;j++)
{
printf("* * * ");
}
printf("\n");
}
}
return 0;
}
(5)一棵树的树体完成后,接下来就要解决树干部分了,该程序中这个树干是最简单的地方,理解树体的形成后,树干的代码编写就不难了,我在此就不一 一赘述了,xdm自己好好理解一下哈。相关代码给你们了哟
for (i = 0;i < h;i++)//树干的形成
{
for (j = 0;j < row - 1;j++)
{
printf(" ");
}
printf("*\n");
}
3. 完整代码及图案展示
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h = 0;
scanf("%d", &h);
int i = 0;
int j = 0;
int row = 3 * h;
for (i = 1;i <= row;i++) //打印row行的树体
{
for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
{
printf(" ");
}
if (i % 3 == 1) //打印一颗星
{
for (j = 0;j < i / 3 + i % 3;j++)
{
printf("* ");
}
printf("\n");
}
else if (i % 3 == 2) //打印两颗星
{
for (j = 0;j < (i - 1) / 3 + (i - 1) % 3;j++)
{
printf("* * ");
}
printf("\n");
}
else //打印三颗星
{
for (j = 0;j < (i - 2) / 3 + (i - 2) % 3;j++)
{
printf("* * * ");
}
printf("\n");
}
}
for (i = 0;i < h;i++)//树干的形成
{
for (j = 0;j < row - 1;j++)
{
printf(" ");
}
printf("*\n");
}
return 0;
}
图案:
4. 结语
各位,我相信看到这句话的人肯定是想解决这一问题的,可能你一下子没看懂,但千万不要放弃,我们的编程之路才刚刚起步,未来一个又一个难到自己的题目会出现,难道要全放弃吗?相信自己,解决自己的疑问才会有所收获,有所进步,才能在进步中喜悦,越走越远!在未来,我会更积极努力地学习编程知识,多写代码,也希望各位如此,希望我们这些现在的菜鸟在未来也可以成为大牛,加油吧各位!
Never Give Up ! ! !