ZOJ 3878--問題解決報告

1643 ワード


テーマ関連:3878関連リンク:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5526EdwardタイピストはQWERTYキーボードレイアウトに慣れてタイプし(このキーボードCaps Lockは失効します)、ある日彼は打った文字をQWERTYキーボードレイアウトからDvorakキーボードレイアウトに変えて、プログラムを変換する必要があります.両者のキーボードレイアウトは図のように比較されます:ZOJ 3878--解题报告
構想分析:この問題は簡単な模擬問題であり、重要なのは問題の意味を理解することである.私たちがしなければならないのは、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;

}