ZeroJudge H026: 猜拳

幼稚園的絲絲很喜歡跟哥哥玩猜拳,因為這是他少數有機會贏哥哥的遊戲。每天只要一回家,絲絲就要哥哥陪他猜拳。
為了戰勝哥哥,絲絲每天在幼稚園時都會花好多時間研究出拳的策略,並將預計要出的拳寫在紙上
但是哥哥上了國中以後功課越來越多,沒有空先思考要出什麼拳,於是哥哥決定根據絲絲出的拳來決定該如何出拳。

每天哥哥只要決定第一次猜拳的狀況 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
ZeroJudge H026 範例測資

解題思路

需要將妹妹猜的拳收到一個陣列中來判斷每一次哥哥要出的拳,收數列的時候判斷目前收到第幾個數字,如果收到第二個數字,則哥哥出的拳為第一個數字,如果是第二個以後的數字,則判斷前兩個數字是否相同。

只要有輸或是贏出現,遊戲就會結束,後面的資料不會用到,但是還是要進行輸入,所以可以宣告一個布林值 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

發佈留言