1 条题解

  • 0
    @ 2025-5-8 21:11:27

    描述

    编写一个程序,从输入文件中读取四行大写(即全是大写字母)文本输入(每行不超过 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 个字符),统计每个大写字母(不包含空格、数字和标点符号)在这些文本中出现的次数,并以垂直直方图的形式输出每个字母的出现情况,最后再输出一行由空格分隔的大写字母,用于标识直方图中各列所代表的字母。

    解题思路

    1. 输入与字母统计:通过 std::getline 逐行读取四行文本,对于每行文本,遍历其中的字符,若字符是大写字母,则将其对应的计数数组 total 中的相应位置加 1,以此统计每个大写字母的出现次数。
    2. 找出最大出现次数:遍历 total 数组,使用 std::max 函数找出其中的最大值 max_t,这个值将决定直方图的高度。
    3. 初始化和填充 word 数组:使用 std::memset 将二维数组 word 初始化为 0,然后根据每个字母的出现次数,在 word 数组中相应位置赋值为 1,表示该字母在对应出现次数位置有星号。
    4. 输出垂直直方图:从最大出现次数 max_t 开始,逐行输出直方图。对于每一行,遍历 26 个字母,根据 word 数组的状态打印空格、星号,从而形成垂直直方图的一行。
    5. 输出字母行:遍历 26 个字母,按格式输出由空格分隔的大写字母,作为直方图的字母标识行。

    算法标签

    1. 字符串处理:使用 std::stringstd::getline 进行文本输入,并遍历字符串中的字符进行字母统计。
    2. 数组操作:利用一维数组 total 统计字母出现次数,二维数组 word 记录直方图中每个位置是否有星号。
    3. 基本循环结构:通过多层循环实现输入文本的处理、统计信息的计算以及直方图和字母标识行的输出。

    代码实现

    #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
    上传者