<NOIP> 20 . P1598 垂直柱状图

来源:互联网 发布:软件设计师资格证书 编辑:程序博客网 时间:2024/06/06 00:48

题解:这是洛谷的第20道题目,本题的难点不在于字符的统计,而是星号字符的打印。

注意

1 . 我们可以这样来,假设我们已经做完了字符的统计。

2 . 按行输出:因为最终输出的都是最后一行平齐,所以我们可以在字符统计中得到出现次数最多的字符和出现的次数N,遍历A到Z,哪个字符能出现N次,打印“*”;接着,再遍历A到Z,哪个字符出现了的次数大于等于N-1,输出“*”。直到N==0。

源代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <sstream>#include <stdlib.h>using namespace std;#define SIZE 26void add(const string str, int *number){    for (size_t i = 0; i < str.size(); i++)    {        switch (str[i])        {        case 'A': number[0]++;    break;        case 'B': number[1]++;    break;        case 'C': number[2]++;    break;        case 'D': number[3]++;    break;        case 'E': number[4]++;    break;        case 'F': number[5]++;    break;        case 'G': number[6]++;    break;        case 'H': number[7]++;    break;        case 'I': number[8]++;    break;        case 'J': number[9]++;    break;        case 'K': number[10]++;    break;        case 'L': number[11]++;    break;        case 'M': number[12]++;    break;        case 'N': number[13]++;    break;        case 'O': number[14]++;    break;        case 'P': number[15]++;    break;        case 'Q': number[16]++;    break;        case 'R': number[17]++;    break;        case 'S': number[18]++;    break;        case 'T': number[19]++;    break;        case 'U': number[20]++;    break;        case 'V': number[21]++;    break;        case 'W': number[22]++;    break;        case 'X': number[23]++;    break;        case 'Y': number[24]++;    break;        case 'Z': number[25]++;    break;        default:            break;        }    }}int main(){    char a, b, c, d;    string str1, str2, str3, str4;    int number[SIZE], counter = 0, max = 0;    //string不接受空格    getline(cin, str1);    getline(cin, str2);    getline(cin, str3);    getline(cin, str4);    memset(number, 0, sizeof(number));    add(str1, number);    add(str2, number);    add(str3, number);    add(str4, number);    for (size_t i = 0; i < 26; i++)        if (max < number[i])            max = number[i];    //paint    for (int i = max; i >0; i--)    {        for (size_t j = 0; j < SIZE; j++)        {            if (number[j] >= i &&j < SIZE - 1)                cout << "* ";            else if (number[j] >= i &&j == SIZE - 1)                cout << "*";            else if (j < SIZE - 1)                cout << "  ";            else                cout << " ";        }        cout << endl;    }    for (size_t i = 0; i < SIZE; i++)    {        putchar('A' + i);        cout << " ";    }    cout << endl;    system("pause");    return 0;}