zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【36oj】 画圣诞树

2023-04-18 15:17:28 时间

原题

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

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

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

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

【说明】

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

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

输入描述

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

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

输出描述

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

用例输入 1

3
1 4 3
5 4 3
5 4 4
2 5
用例输出 1

        *
      *****
    *********
      *****
    *********
  *************
      *****
    *********
  *************
*****************
      *****
      ***** 

这个题不是什么难题,只是写的找规律过程比较巧妙,遂发之
也不讲了,上代码

#include<iostream>

using namespace std;

int n;
int a[1000005][5];
int x,y;

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i][1]>>a[i][2]>>a[i][3];
	}
	cin>>x>>y;
	int cnt=0;
	for(int i=1;i<=n;i++){
		if((a[i][1]+a[i][2]*(a[i][3]-1))>cnt){
			cnt=a[i][1]+a[i][2]*(a[i][3]-1);
		}
	}
	for(int i=1;i<=n;i++){//画树
		for(int t=1;t<=a[i][3];t++){
			int k=a[i][1]+(a[i][2]*(t-1));
			for(int j=1;j<=(cnt-k)/2;j++) cout<<" ";
			for(int j=1;j<=k;j++) cout<<"*";
			cout<<endl;
		}
	}
	for(int i=1;i<=x;i++){//画树干
		for(int j=1;j<=(cnt-y)/2;j++) cout<<" ";
		for(int j=1;j<=y;j++) cout<<"*";
		cout<<endl;
	}
}