2018年湘潭大学程序设计竞赛-B-String(模拟)

题目描述 

有一个只包含大写字母和数字的字符串S,和一个6*6的字符组成的正方形如下图,正方形中恰好包含0-9和A-Z各一个字符。正方形的一行在字符串S中的出现次数是这行6个字符在S中出现次数的总和,正方形的一列在字符串S中的出现次数是这列6个字符在S中出现次数的总和。如果正方形中一个字符所在行的出现次数是所有行中最多,并且所在列的出现次数是所有列中最多,这个字符是需要被找出的。
012345
6789AB
CDEFGH
IJKLMN
OPQRST
UVWXYZ

输入描述:

第一行是一个整数T(1 ≤ T ≤ 400),表示样例的个数。
每个样例一行字符串S,长度1≤ len ≤ 500。

输出描述:

每组数据输出一行需要找出的所有字符,如果需要找出的字符有多个,所在行不同的按行从小到大排序,所在行相同的按列从小到大排序。
示例1

输入

3
13579
AADD
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

输出

13
7ADG
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char mp[6][7]={
"012345",
"6789AB",
"CDEFGH",
"IJKLMN",
"OPQRST",
"UVWXYZ"
};
int main()
{
    int t,h[6],l[6]; //记录每行/列出现字符个数 
    string str;
    scanf("%d",&t);
    while(t--)
    {
        cin >> str;
        int len = str.length();
        memset(h,0,sizeof(h));
        memset(l,0,sizeof(l));
        for(int i = 0; i < 6; i++)
        {
            for(int j = 0; j < 6; j++)
            {
                for(int k = 0; k < len; k++)
                {
                    //统计字符所在行列的个数 
                    if(mp[i][j] == str[k])
                    {
                        h[i]++; l[j]++;
                    }
                }

            }
        }
        //求行和列的最大出现字符数 
        int maxl = -1,maxh = -1;
        for(int i = 0; i < 6; i++)
        {
            for(int j = 0; j < 6; j++)
            {
                maxh = max(maxh,h[i]);
                maxl = max(maxl,l[i]);
            }
        }
        //找到行列出现字符数都为最大值的字符输出 
        for(int i = 0; i < 6; i++)
        {
            if(h[i] == maxh)
                for(int j = 0; j < 6; j++)
                {
                    if(l[j] == maxl)
                        cout<<mp[i][j];
                }
        }
        cout << endl;
    }
}


猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/80177510