题解:P13311 [GCJ 2012 Qualification] Speaking in Tongues
P13311 题解
解法
题意其实很简单,通过给的样例输入输出,推出解密表,完成程序。
\
只需要将输入的每一行的字母跟输出的 Case #X:S后的字母一一对应即可。不过完成后发现密文 q 和 z没有出现,这时候看题目第二段可知 z 对应 q。因为字母都是一一对应的,所以q只能对应z。
\
对应的实现可以使用 map,当然你也可以用 char 类型数组,对于每次读入的字符 int(s[i]-'a')去与明文数组下标对应。
坑点
- 如果你使用了
getline(),请注意在读入第一个字符串前用一下getchar(),否则getline会读入 T 后的回车,你就会少一行输出。 - 输出的格式注意是
Case #X: S,Case #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;
}
提交记录