问题描述
p10082原题链接:UVaOJ 10082 - WERTYU
相关说明:本题为《算法竞赛入门经典(第2版)》例题 3-2
解法一:模拟
模拟读入,可一边读一边处理(逐字符或逐行地),需要找到当前字符 ch 在键盘 KB 中所在的位置(找不到则原样输出),根据题目描述的偏移量为 1 的性质进行替换,然后直接输出即可。由于题目保证了输入没有 Q, A, Z 字符,所以可以把三行键盘拼在一起作为一整个字符串常量,方便查询。注意这里用到的 find 是 STL 中很常见的接口,也可以自己实现它,比如用 for 循环扫描字符串来尝试找到 pos 位置。
容易忽视的地方:没有处理 \\ 的转义(下面的代码块渲染成 HTML 被转义成 \ 的话,请双击查看源码)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <bits/stdc++.h> using namespace std; int main() { const string KB = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; char ch; while ((ch = getchar()) != EOF) { int pos = KB.find(ch); if (pos != string::npos) cout << KB[pos - 1]; else cout << ch; } return 0; } |
1 2 3 4 5 6 7 8 |
import sys KB = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./" for line in sys.stdin: for ch in line: idx = KB.find(ch) print(KB[idx - 1] if idx >= 0 else ch, end="") |