HDU2708 Vertical Histogram
USACO 2003 February Orange
问题链接:HDU2708 Vertical
Histogram。
问题简述:参见上述链接。
问题分析:
这个题与POJ2136应该算是同一题,在HDU中测试数据有所不同:
1.输入的测试数据可能有多组;
2.结果的每一行,最后的空格不输出(坑的地方)。
统计四行输入的大写字母,根据统计结果输出柱状图。
该问题的关键是需要一定的想象力,将统计数据转换成相应的图形。
需要注意的一点是,如果出现次数最多字符的出现次数为max,则输出max行。这是关键的地方。
程序说明:
(略)。
AC的C++语言程序如下:
/* HDU2708 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, line; 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--) { line = ""; for(int j=0; j<MAXN; j++) { if(acount[j] >= i) line += "* "; else line += " "; } int k = line.size() - 1; while (line[k] == ' ') { line.erase(k, 1); k--; } cout << line << endl; } for(int i=0; i<MAXN-1; i++) cout << (char)('A' + i) << " "; cout << 'Z' << endl; memset(acount, 0, sizeof(acount)); } } return 0; }