ZeroJudge M801: 鏡像對稱 (Mirror)

你醒來後發現自己被關入一間密室當中,四處環視後發現牆壁上寫著許多以大寫英文字母組成的字串。你從角落中找到一張紙條,得知了離開密室的關鍵需要先找出牆上所有的鏡像對稱字串。

這裡所謂的鏡像對稱,需滿足兩個條件:

  1. 該字串是一個迴文,即從左讀到右的結果等同於從右讀到左的結果
  2. 該字串僅包含字母 AHIMOTUVWXY

請你撰寫一個程式判斷字串是否為鏡像對稱。

範例測資

範例輸入範例輸出
輸入資料共一行,包含一個字串,字串長度為 N (1 ≤ N < 1000)。字串僅包含大寫英文字母。輸出一個字串「Yes」或「No」,表示輸入字串是否為鏡像對稱。
AYes
ABANo
HOHOHYes

    解題思路

    可以使用EOF的方式一個字元一個字元來收並使用 Map 或 If 來判斷該字元是否為 AHIMOTUVWXY 的其中一個,需要注意的是,就算判斷到該字元不屬於 AHIMOTUVWXY 也需要把資料讀完才能輸出No,所以可以使用一個布林值來存能不能直接輸出No。如果為 AHIMOTUVWXY 的其中一個字元的話就將其字元加到一個 String 的變數中待 EOF 結束後做迴文的判斷。迴文的判定可以使用 Reverse 來判斷從右到左和從左到右的字串是否為一樣的。

    範例程式碼-ZeroJudge M801: 鏡像對稱 (Mirror)

    #include <iostream>
    #include <map>
    #include <algorithm>
    using namespace std;
    
    int main() {
        cin.sync_with_stdio(0);
        cin.tie(0);
        char ch;
        string str = "";
        map<char, int>MAP;
        MAP['A'] = 1;
        MAP['H'] = 1;
        MAP['I'] = 1;
        MAP['M'] = 1;
        MAP['O'] = 1;
        MAP['T'] = 1;
        MAP['U'] = 1;
        MAP['V'] = 1;
        MAP['W'] = 1;
        MAP['X'] = 1;
        MAP['Y'] = 1;
        bool stop = false;
        while (cin >> ch)
        {
            if (MAP[ch] == 1) str += ch;
            else stop = true;
        }
        if (stop) cout << "No\n";
        else
        {
            string tmp = str;
            reverse(tmp.begin(), tmp.end());
            if (tmp == str) cout << "Yes\n";
            else cout << "No\n";
        }
    }
    
    //ZeroJudge M801
    //Dr. SeanXD

    發佈留言