Description | ||
题目描述 打印一个字母圣诞树。 输入 第一行是一个整数K,表示样例的个数。以后每个样例是一个大写英文字母,占一行。 输出 输出对应的字母圣诞树,每行末尾没有空格,每个圣诞树的最后一行前无空格。 样例输入 5 A B C D E 样例输出 A AAA A AAA B BBBBB A AAA B BBBBB C CCCCCCC A AAA B BBBBB C CCCCCCC D DDDDDDDDD A AAA B BBBBB C CCCCCCC D DDDDDDDDD E EEEEEEEEEEE |
思路分析:不难看出,这题的输出分为奇数行和偶数行,因此我们应该分别处理,奇数行较为简单,而偶数行就需要分析。不妨先对奇数行进行分析,假设存在6行,那么奇数行前面的空格就只有三个即n/2个空格,对于 偶数行,令第一行i=0,则依次到i=5,用j控制空格,k控制字母当i=1时A前面有两个空格,当i=3时B前面有一个空格,当i=5时C前面有零个空格。再根据这个递推关系找到j与n,i之间的关系就可以控制空格的最大数量.之后再看偶数行的字母,容易得到,字母数量为i+2即k<i+3.
#include<stdio.h>
#include <iostream>
using namespace::std;
int main()
{
int a;
cin >> a;
for (int i = 0; i < a; i++)
{
//行数确定:
char ch;
char ch1 = 'A';
char ch2;
cin >> ch;
int n = (ch - 64) * 2;//确定行数;
//总体的循环
for (int i = 0; i < n; i++)
{
//对于偶数行
if (i == 0 || i % 2 == 0)
{
for (int j = 0; j < n / 2; j++)//对于空白
{
cout << " ";
}
ch2 = ch1 + i / 2;
cout << ch2 << endl;
}
//对于奇数行
if (i == 1 || (i - 1) % 2 == 0)
{
for (int j = 0; j < (n - i - 1) / 2; j++)
{
cout << " ";
}
ch2 = ch1 + (i - 1) / 2;
for (int k = 0; k < i + 2; k++)//对于字母
{
cout << ch2;
}
cout << endl;
}
}
}
}