ZOJ 3878--問題解決報告
1643 ワード
テーマ関連:3878関連リンク:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5526EdwardタイピストはQWERTYキーボードレイアウトに慣れてタイプし(このキーボードCaps Lockは失効します)、ある日彼は打った文字をQWERTYキーボードレイアウトからDvorakキーボードレイアウトに変えて、プログラムを変換する必要があります.両者のキーボードレイアウトは図のように比較されます:
構想分析:この問題は簡単な模擬問題であり、重要なのは問題の意味を理解することである.私たちがしなければならないのは、2つのキーボードの文字を1つ1つマッピングすることです.もちろん、異なるキーをマッピングし、同じキーを無視してもいいです.
ACコード:
#include <cstdio>
#include <cstring>
#include <map>
#include <cassert>
std::map<char, char> kbmap;
void init() {
const char *key1 = "-=_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"zxcvbnm,./ZXCVBNM<>?";
const char *key2 = "[]{}',.pyfgcrl/=\\\"<>PYFGCRL?+|aoeuidhtns-AOEUIDHTNS_;qjkxbmwvz:QJKXBMWVZ";
size_t key1_len = strlen(key1);
size_t key2_len = strlen(key2);
assert(key1_len == key2_len);
for ( size_t i = 0; i < key1_len; i++ ) {
kbmap[key1[i]] = key2[i];
}
}
void convert(char *buffer) {
int len = strlen(buffer);
for ( int i = 0; i < len; i++ ) {
char ch = buffer[i];
if ( kbmap.find(ch) != kbmap.end() ) {
buffer[i] = kbmap[ch];
}
}
}
int main()
{
init();
char buffer[1024 * 2];
while ( fgets(buffer, sizeof(buffer), stdin) != NULL ) {
convert(buffer);
printf("%s", buffer);
}
return 0;
}