题解:P13311 [GCJ 2012 Qualification] Speaking in Tongues

· · 题解

P13311 题解

解法

题意其实很简单,通过给的样例输入输出,推出解密表,完成程序。 \ 只需要将输入的每一行的字母跟输出的 Case #X:S后的字母一一对应即可。不过完成后发现密文 qz没有出现,这时候看题目第二段可知 z 对应 q。因为字母都是一一对应的,所以q只能对应z。 \ 对应的实现可以使用 map,当然你也可以用 char 类型数组,对于每次读入的字符 s_i 使用 int(s[i]-'a')去与明文数组下标对应。

坑点

  1. 如果你使用了 getline(),请注意在读入第一个字符串前用一下 getchar(),否则getline会读入 T 后的回车,你就会少一行输出。
  2. 输出的格式注意是 Case #X: SCase #X:S存在一个空格

代码

map<char, char> mp = {{'a', 'y'},{'b', 'h'},{'c', 'e'},{'d', 's'},{'e', 'o'},{'f', 'c'},{'g', 'v'},{'h', 'x'},{'i', 'd'},{'j', 'u'},{'k', 'i'},{'l', 'g'},{'m', 'l'},{'n', 'b'},{'o', 'k'},{'p', 'r'},{'q', 'z'},{'r', 't'},{'s', 'n'},{'t', 'w'},{'u', 'j'},{'v', 'p'},{'w', 'f'},{'x', 'm'},{'y', 'a'},{'z', 'q'}};
inline bool is_letter(char a)
{
    if (a >= 'a' && a <= 'z') return true;
    return false;
}
int main()
{
    int T, cur = 1;
    string s;
    cin >> T;
    getchar();//吸收多余回车,否则会干扰 getline
    while (T--)
    {
        getline(cin, s);//由题密文中有空格,所以采用 getline 读入
        int n = s.size();
        cout << "Case #" << cur << ": ";//这里建议复制输出 1 中的格式,防止手输出错。 
        for (int i = 0; i < n; ++i)
        {
            if (is_letter(s[i])) cout << mp[s[i]];//如果是小写字母就跟输出对应原文,否则直接输出密文 
            else cout << s[i];
        }
        cout << "\n";
        ++cur;//计次 
    } 
    return 0;
}

提交记录