你醒來後發現自己被關入一間密室當中,四處環視後發現牆壁上寫著許多以大寫英文字母組成的字串。你從角落中找到一張紙條,得知了離開密室的關鍵需要先找出牆上所有的鏡像對稱字串。
這裡所謂的鏡像對稱,需滿足兩個條件:
- 該字串是一個迴文,即從左讀到右的結果等同於從右讀到左的結果
- 該字串僅包含字母 AHIMOTUVWXY
請你撰寫一個程式判斷字串是否為鏡像對稱。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入資料共一行,包含一個字串,字串長度為 N (1 ≤ N < 1000)。字串僅包含大寫英文字母。 | 輸出一個字串「Yes」或「No」,表示輸入字串是否為鏡像對稱。 |
A | Yes |
ABA | No |
HOHOH | Yes |
解題思路
可以使用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