您的位置:首页 > 大数据 > 人工智能

POJ NOI0113-04 垂直直方图(Bailian2800)

2017-04-18 23:04 281 查看
问题链接POJ NOI0113-04 垂直直方图

原题出处Bailian2800 垂直直方图

总时间限制:1000ms内存限制: 65536kB描述
输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数。注意:只用输出字符的出现次数,不用输出空白字符,数字或者标点符号的输出次数。

输入输入包括4行由大写字母组成的文本,每行上字符的数目不超过80个。输出输出包括若干行。其中最后一行给出26个大写英文字母,这些字母之间用一个空格隔开。前面的几行包括空格和星号,每个字母出现几次,就在这个字母的上方输出一个星号。注意:输出的第一行不能是空行。样例输入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!

样例输出
*
*
*                   *
*                   *     *   *
*                   *     *   *
*       *     *             *     *   *
*       *     * *     * *   *     * * *
*       *   * * *     * *   * *   * * * *
*     * * * * * *     * * * * *   * * * *     * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
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 February Orange的试题。

问题分析

  统计四行输入的大写字母,根据统计结果输出柱状图。

  该问题的关键是需要一定的想象力,将统计数据转换成相应的图形。

  需要注意的一点是,如果出现次数最多字符的出现次数为max,则输出max行。这是关键的地方。

程序说明

  (略)。

参考链接POJ2136 Vertical Histogram

AC的C++语言程序:

/* POJ2136 Vertical Histogram */

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>

using namespace std;

const int MAXN = 26;
int acount[MAXN];

int main()
{
int linecount, max;
string s;

memset(acount, 0, sizeof(acount));

linecount = 0;
while (getline(cin, s)) {
// 统计字母
for(int i=0; i<(int)s.size(); i++)
//            if(isalpha(s[i]))
//                acount[s[i] - 'A']++;
if(isupper(s[i]))
acount[s[i] - 'A']++;

// 每4行输出一次结果
if(++linecount == 4) {
linecount = 0;

// 计算最大的统计值
max = 0;
for(int i=0; i<MAXN; i++)
if(acount[i] > max)
max = acount[i];

// 输出max行
for(int i=max; i>0; i--) {
for(int j=0; j<MAXN; j++) {
if(acount[j] >= i)
cout << "* ";
else
cout << "  ";
}
cout << endl;
}

for(int i=0; i<MAXN; i++)
cout << (char)('A' + i) << " ";
cout << endl;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: