空心三角形——HDU-2091

题目

Problem Description
把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果。在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出来,以便看看效果。

Input
每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。

Output
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。

Sample Input
X 2
A 7
@
空心三角形——HDU-2091

题解

程序应能够实现多组数据的输入,每组数据输入一个字符和一个整数。遇到@字符则停止输入同时输出对应的三角形,每个三角形之间有一空行。

思路

通过主函数实现多组数据的输入同时判断是否应该停止输入。主函数完成数据的输入后调用函数进行三角形的输出。输出函数:使用循环控制前n-1行的输出,对于前n-1行,每行(第一行除外)都可以拆分成四部分:n-i个空格——第一个字符——2*(i+1)-3个空格——第二个字符;最后一行直接输出2*n-1个字符即可。

代码实现

#include<iostream>
using namespace std;
void done(char a, int n);
int main()
{
	char a[100]; int i=0, b[100];
	while (1)
	{
		cin >> a[i];
		if (a[i] != '@')cin >> b[i];
		else break;
		i++;
	}
	i = 0;
	while (a[i] != '@')
	{
		done(a[i], b[i]);
		i++;
		if(a[i] != '@')cout << endl;
	}
}
void done(char a, int n)
{
	for (int i = 0; i < n - 1; i++)//控制前n-1行的输出
	{
		for (int j = n - i; j > 1; j--)//第i行第一个字符前有n-i个空格
			cout << " ";
		cout << a;//输出第一个字符
		if (i >= 1)//从第二行开始
		{
			for (int j = 0; j < 2 * (i + 1) - 3; j++)
				cout << " ";//两个字符中间有2*(i+1)-3个空格
			cout << a;//输出第二个字符
		}
		cout << endl;
	}
	for (int j = 0; j < 2 * n - 1; j++)
		cout << a;//输出最后一行有2*n-1个字符
	cout << endl;
}