1 条题解
-
0
描述
编写一个程序,从输入文件中读取四行大写(即全是大写字母)文本输入(每行不超过 72 个字符),并打印一个垂直直方图,展示每个字母(不包括空格、数字或标点符号)在全大写输入中出现的次数。严格按照所示格式输出。
输入
- 第 1 行到第 4 行:四行大写文本,每行不超过 72 个字符。
输出
- 第 1 行到若干行:若干行包含星号和空格的内容,后面跟着一行由空格分隔的大写字母。任何一行的末尾都不要打印不需要的空格。不要打印任何前导空白行。
输入数据 1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
输出数据 1
* * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
来源
USACO 2003 年 2 月 Orange 组
题意分析
程序的任务是读取四行大写字母文本(每行不超过 72 个字符),统计每个大写字母(不包含空格、数字和标点符号)在这些文本中出现的次数,并以垂直直方图的形式输出每个字母的出现情况,最后再输出一行由空格分隔的大写字母,用于标识直方图中各列所代表的字母。
解题思路
- 输入与字母统计:通过
std::getline
逐行读取四行文本,对于每行文本,遍历其中的字符,若字符是大写字母,则将其对应的计数数组total
中的相应位置加 1,以此统计每个大写字母的出现次数。 - 找出最大出现次数:遍历
total
数组,使用std::max
函数找出其中的最大值max_t
,这个值将决定直方图的高度。 - 初始化和填充
word
数组:使用std::memset
将二维数组word
初始化为 0,然后根据每个字母的出现次数,在word
数组中相应位置赋值为 1,表示该字母在对应出现次数位置有星号。 - 输出垂直直方图:从最大出现次数
max_t
开始,逐行输出直方图。对于每一行,遍历 26 个字母,根据word
数组的状态打印空格、星号,从而形成垂直直方图的一行。 - 输出字母行:遍历 26 个字母,按格式输出由空格分隔的大写字母,作为直方图的字母标识行。
算法标签
- 字符串处理:使用
std::string
和std::getline
进行文本输入,并遍历字符串中的字符进行字母统计。 - 数组操作:利用一维数组
total
统计字母出现次数,二维数组word
记录直方图中每个位置是否有星号。 - 基本循环结构:通过多层循环实现输入文本的处理、统计信息的计算以及直方图和字母标识行的输出。
代码实现
#include <iostream> #include <string> #include <algorithm> #include <cstring> const int MAXN = 35; int main() { std::string s; int total[MAXN], word[MAXN][100]; std::memset(total, 0, sizeof(total)); for (int i = 0; i < 4; i++) { std::getline(std::cin, s); int len = s.length(); for (int j = 0; j < len; j++) { if (s[j] >= 'A' && s[j] <= 'Z') { total[s[j] - 'A']++; } } } int max_t = total[0]; for (int i = 0; i <= 25; i++) { max_t = std::max(max_t, total[i]); } std::memset(word, 0, sizeof(word)); for (int i = 0; i <= 25; i++) { for (int j = 1; j <= total[i]; j++) { word[i][j] = 1; } } for (int i = max_t; i > 0; i--) { for (int j = 0; j <= 25; j++) { if (!word[j][i] && j == 0) { std::cout << " "; } else if (word[j][i] && j == 0) { std::cout << "*"; } else if (!word[j][i]) { std::cout << " "; } else if (word[j][i]) { std::cout << " *"; } } std::cout << std::endl; } for (int i = 0; i <= 25; i++) { if (i == 0) { std::cout << static_cast<char>(i + 'A'); } else { std::cout << " " << static_cast<char>(i + 'A'); } } std::cout << std::endl; return 0; }
- 1
信息
- ID
- 1137
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者