幼稚園的絲絲很喜歡跟哥哥玩猜拳,因為這是他少數有機會贏哥哥的遊戲。每天只要一回家,絲絲就要哥哥陪他猜拳。
為了戰勝哥哥,絲絲每天在幼稚園時都會花好多時間研究出拳的策略,並將預計要出的拳寫在紙上
但是哥哥上了國中以後功課越來越多,沒有空先思考要出什麼拳,於是哥哥決定根據絲絲出的拳來決定該如何出拳。
每天哥哥只要決定第一次猜拳的狀況 F,接下來他的猜拳策略如下:
- 如果絲絲連續兩輪出了一樣的拳,下一輪他就會出打敗絲絲前兩輪的拳。
- 否則,他下一輪會出跟絲絲前一輪一樣的拳。
請你寫一個程式模擬兩人遊戲過程與結果。
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行輸入哥哥第一輪要出的拳 F。 第二行輸入妹妹準備的數量 N。 第三行依序輸入妹妹準備出的拳 y1、y2、… 、yN,以空格隔開。 | 輸出有一行,依序輸出哥哥每一回合猜的拳,以空格隔開。並在冒號後輸出第幾回合分出勝負。 若在第 k 輪時哥哥贏了,輸出「Won at round k」 若在第 k 輪時哥哥輸了,輸出「Lost at round k」 若比完 N 輪仍然平手,輸出「Drew at round N」 |
0 4 2 5 0 2 | 0 : Won at round 1 |
2 2 2 0 | 2 2 : Lost at round 2 |
5 4 5 5 0 0 | 5 5 2 : Lost at round 3 |
5 6 5 5 2 2 0 0 | 5 5 2 2 0 0 : Drew at round 6 |
解題思路
需要將妹妹猜的拳收到一個陣列中來判斷每一次哥哥要出的拳,收數列的時候判斷目前收到第幾個數字,如果收到第二個數字,則哥哥出的拳為第一個數字,如果是第二個以後的數字,則判斷前兩個數字是否相同。
只要有輸或是贏出現,遊戲就會結束,後面的資料不會用到,但是還是要進行輸入,所以可以宣告一個布林值 finish 預設為 false,如果有輸贏出現則將 finish 設定為 true,在 For迴圈 中的每一次收資料之後判斷,如果 finish == true 則 continue 不做後面的判斷。
因為也是會有永遠平手的情況,所以在 For迴圈 結束之後要判斷 finish 是否為 true,如果 !finish 則代表還沒有分出勝負,則要輸出 「Drew at round N」。
範例程式碼-ZeroJudge H026: 猜拳
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int F, N;
cin >> F >> N;
vector<int>num;
map<int, int>MAP;
MAP[0] = 5;
MAP[2] = 0;
MAP[5] = 2;
bool finish = false;
for (int i = 0; i<N; i++) {
int tmp;
cin >> tmp;
if (finish) continue;
num.push_back(tmp);
if (i == 1) F = num[0];
else if (i > 1) {
if (num[i-2] == num[i-1]) F = MAP[num[i-2]];
else F = num[i-1];
}
cout << F << " ";
if ((F == 0 && tmp == 5) || (F == 2 && tmp == 0) || (F == 5 && tmp == 2)) {
cout << ": Lost at round " << i+1 << "\n";
finish = true;
continue;
}
if ((F == 0 && tmp == 2) || (F == 2 && tmp == 5) || (F == 5 && tmp == 0)) {
cout << ": Won at round " << i+1 << "\n";
finish = true;
}
}
if (!finish) cout << ": Drew at round " << N << "\n";
}
//ZeroJudge H026
//Dr. SeanXD