poj 2136 Vertical Histogram 解题报告

     题目链接:http://poj.org/problem?id=2136

     题意不难理解,就是输入四行字符串(每行字符总数不超过72个),统计26个英文字母的数目,并按柱状图的形式输出。我的思路就是,先用一维数组total[]统计每个英文字母的个数,接着找出最大的频率,保存在max中;紧接着用一个二维数组word[][](这个比较关键)记录每一个字母在0~max中是否存储数据,有的话则置1,没有则为0。(假如:字母'A'的频率是2,max = 10,那么word[0][0] = 0, word[0][1] = 1, word[0][2] = 1, word[0][3] = 0......word[0][10] = 0,代表)接着用两重循环输出表格即可。

     

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 
 6 const int maxn = 30;
 7 
 8 int main()
 9 {
10     char s[100];
11     int i, j, n, len, max, total[maxn], word[maxn][100];
12     n = 4;
13     memset(total, 0, sizeof(total));
14     while (n--)
15     {
16         gets(s);
17         len = strlen(s);
18         for (i = 0; i < len; i++)
19         {
20             total[s[i]-'A']++;    // 统计每个字母出现的次数(total[0]对应'A',total[1]对应'B',依此类推)
21         }
22     }
23     max = total[0];
24     for (i = 0; i <= 25; i++)
25     {
26         if (max < total[i])            // 在所有字母中找出最大的出现次数
27             max = total[i];
28     }
29     memset(word, 0, sizeof(word));
30     for (i = 0; i <= 25; i++)
31     {
32         for (j = 1; j <= total[i]; j++)
33         {
34             word[i][j] = 1;    // 标记每个字母出现的数目
35         }
36     }
37     for (i = max; i > 0; i--)
38     {
39         for (j = 0; j <= 25; j++)
40         {
41             if (!word[j][i] && j == 0)
42             {
43                 printf(" ");
44             }
45             else if (word[j][i] && j == 0)
46                 printf("*");
47             else if (!word[j][i])
48                 printf("  ");
49             else if (word[j][i])
50                 printf(" *");
51         }
52         printf("\n");
53     }
54     for (i = 0; i <= 25; i++)
55     {
56         if (i == 0)
57             printf("%c", i + 'A');
58         else
59             printf(" %c", i + 'A');  
60     } 
61     printf("\n");
62     return 0;
63 }
原文地址:https://www.cnblogs.com/windysai/p/3204510.html