同題:UVa 00489 – Hangman Judge
Hangman Judge 是一個猜英文單字的小遊戲 (在電子字典中常會看到),遊戲規則如下:
- 答案單字寫在紙上 (每個字元一張紙),並且被蓋起來,玩家每次猜一個英文字元 (letter)。
- 如果這個英文字元猜中(在答案的英文單字中有出現),被猜中的字元就被翻開。例如:答案是 book,如果你猜 o,book 中的兩個 o 就會被視為已猜中。
- 如果這個英文字元未出現在答案的單字中,就會在 hangman 的圖中多加一劃。要完成hangman 圖共需 7 劃。注意:同一個猜錯的字元只能再圖上畫一劃,例如:答案是 book,第一次你猜 a(未猜中)會在圖上畫一劃,但第二次以後再猜 a 並不會再多畫。
- 如果在 hangman 圖完成之前,玩家已猜中所有答案中的字元,則玩家贏 (win)。
- 如果玩家尚未猜中所有答案中的字元而 hangman 圖完成了,,則玩家輸 (lose)。
- 如果玩家在還沒輸贏的情況之下就不玩了,那我們說玩家膽小放棄了 (chicken out)。
你的任務就是要寫一個程式根據答案及玩家輸入的猜測來判斷玩家是贏、輸、或放棄。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每一組有 3 列。第一列為一個數字 N,代表第幾回合,第二列為這一回合的答案,第三列為這一回合玩家輸入的猜測。如果 N = -1 代表輸入結束。 | 請輸出每一回合及遊戲結果。遊戲結果只有三種可能: You win. You lose. You chickened out. |
1 cheese chese 2 cheese abcdefg 3 cheese abcdefgij -1 | Round 1 You win. Round 2 You chickened out. Round 3 You lose. |
解題思路
收到猜測字串的時候跑 For迴圈 判斷每一個字元,如果有猜對的話就將答案的字元 Map 值歸零,如果猜錯的話就把猜錯的次數 +1,如果超過 7 次直接輸出輸了,如果在七次內猜對就輸出贏了。如果結束For迴圈之後還沒有輸出任何東西,則代表半途而廢輸出指定的字串。
範例程式碼-ZeroJudge D217: Hangman Judge
#include <iostream>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
while (cin >> N && N != -1)
{
string str;
cin >> str;
map<char, int>ans, guess;
for (int i = 0; i<str.length(); i++)
{
ans[str[i]] = 1;
}
cin >> str;
int count = 0;
bool chicken = true;
for (int i = 0; i<str.length(); i++)
{
if (ans[str[i]] == 1)
{
ans[str[i]] = 0;
count--;
}
if (guess[str[i]] == 0)
{
guess[str[i]]++;
count++;
}
if (count >= 7)
{
chicken = false;
cout << "Round " << N << "\n";
cout << "You lose.\n";
break;
}
bool ok = true;
for (auto it:ans)
{
if (it.second == 1)
{
ok = false;
break;
}
}
if (ok)
{
chicken = false;
cout << "Round " << N << "\n";
cout << "You win.\n";
break;
}
}
if (chicken && count < 7)
{
cout << "Round " << N << "\n";
cout << "You chickened out.\n";
}
}
}
//ZeroJudge D217
//Dr. SeanXD