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

· · 题解

你说得对,但是我刚开始以为这题的映射有规律然后找了十分钟。

思路

注意到题面给的三个映射和样例包含的映射基本覆盖了全部的字母,所以我们开个 map,一个一个输进去即可。

找完发现还有一个 z 没有在键中出现,再找一下发现 q 没有在值中出现,将它们两个对应起来。

现在我们有了映射数组,剩下就简单了,遍历字符串,输出字符对应的值即可。

另外这题输入有点坑,因为字符串中有空格,所以只能用 getline,同时又因为 getline 会把 T 也给读进去,所以需要用 cin.ignore()

代码

#include<bits/stdc++.h>
using namespace std;
int n; 
string s;
map<char,char>mp;
int main(){
    mp['a']='y',mp['b']='h',mp['c']='e',mp['d']='s',mp['e']='o',mp['f']='c';
    mp['g']='v',mp['h']='x',mp['i']='d',mp['j']='u',mp['k']='i',mp['l']='g';
    mp['m']='l',mp['n']='b',mp['o']='k',mp['p']='r',mp['q']='z',mp['r']='t';
    mp['s']='n',mp['t']='w',mp['u']='j',mp['v']='p',mp['w']='f',mp['x']='m';
    mp['y']='a',mp['z']='q',mp[' ']=' ';
    cin>>n;
    cin.ignore();
    for(int t=1;t<=n;t++){
        getline(cin,s);
        cout<<"Case #"<<t<<": ";
        for(int i=0;i<s.size();i++){
            cout<<mp[s[i]];
        }
        cout<<endl;
    }
}