#3766. 画圣诞树

画圣诞树

Description

圣诞节要到了,不少商家在宣传板上绘制了圣诞树的图案,如图所示。一棵圣诞树由A和B两部分组成:

0015.png A是由n(n≥)个呈三角形的字符矩阵构成的,每个字符矩阵由三个参数ai、bi、ci唯一确定。Ai表示字符矩阵第一行字符的个数;bi表示字符矩阵从第二行开始每一行与它上面那行的字符数之差均为bi;ci则表示字符矩阵的行数。

B是一个x行y列的长方形,由x和y这两个参数唯一确定。

因为圣诞树是中轴对称的,所以根据所有的参数构成的圣诞树是唯一确定的。简单来讲,我们所说的一棵圣诞树就是像图那样的矩阵,每一行的字符是指若干个连在一起的


【说明】

(1)输入数据保证圣诞树不会超出一页纸的范围。

(2)要求圣诞树是轴对称的,并且字符矩阵的第一列至少有一个非空格字符,即圣诞树尽量“顶格写”。在以上要求下,输出的圣诞树矩阵一定是唯一的(不考虑每行行末的空格)。

</p>

Input Format

输入数据分若干行。第一行是一个整数n,表示A部分中字符矩阵的个数。以下n行,每行有三个正整数ai、bi、ci(ai为奇数,bi为偶数)。

输入数据的最后一行,有两个正整数x、y(y是奇数),表示B部分的行数和列数。

Output Format

对于输入数据给定的圣诞参数,输出与之对应的圣诞树矩阵。

3
1 4 3
5 4 3
5 4 4
2 5 
        *
      *****
    *********
      *****
    *********
  *************
      *****
    *********
  *************
*****************
      *****
      ***** 

Hint

【问题分析】

题目中已经提示我们,圣诞树是由A 和B 两部分构成。因此绘制图形也分两部分来考虑。而A 和B 的绘制都要考虑图形的对称轴。于是,将整个问题分解为三个子问题:

(1) 确定对称轴; (2)绘制A 部分; (3)绘制B 部分。


【问题分析】

分析子问题1 :设*个数最多的行有m 个*,那么A 和B 部分的对称轴所在列数就应该是(m + 1)div 2 。

分析子问题2 :A 部分分成了n 段树,每一段树的图形打印方式是类似的,所以只需要着眼于如何打印某一段树即可。这个小问题是一个关于循环的问题,在循环结构程序设计中已经研究过。

分析子问题3 :B 部分的填充比较容易,填入x 行,每行y 个*即可。再深入分析一下,还有一个巧妙的处理,B 部分实际上相当于A 中的特殊段:ai = y ,bi = 0 ,ci = x 。于是,子问题3 也可以归入子问题2 。

至此,成功解决了输出圣诞树这个问题。


【关键点】过程+找规律

Source

CodesOnline