ZeroJudge F442: 老鷹抓小雞 Eagle

老鷹抓小雞是小孩很喜歡玩的一種遊戲,他的玩法是由一人扮演老鷹,一人扮演母雞,其他人扮演小雞,所有小雞都要躲在母雞身後。遊戲開始後老鷹會去抓跟不上母雞的小雞,當老鷹抓到小雞,就結束一回合的遊戲,被抓到的小雞會改扮演老鷹老鷹則被排進被抓到的小雞原本的位置中,改扮演小雞,然後就開始下一回合的遊戲。
請寫一個程式模擬遊戲後的隊伍情況。

範例測資

範例輸入範例輸出
輸入總共五列,第一列有一個整數 N (2 ≤ N ≤ 2000),表示小雞的總數量。第二列有 N 個整數ㄝ代表一開始扮演小雞的人的編號 Ci (1 ≤ Ci ≤ 10000,1 ≤ i ≤ N)。
第三列有一個整數 E (1 ≤ E ≤ 10000),代表一開始扮演老鷹的人的編號。第四列有一個整數 Q (1 ≤ Q ≤ 200),代表經過幾回合的遊戲。第五列有 Q 個整數,代表每一回合被抓到的小雞的編號。整數之間以空白間隔。
輸出一行,為 Q 回合遊戲結束後小雞的編號序列,編號間以一個空白間隔。
2
13 35
5
1
35
13 5
5
54 88 9 21 27
76
3
88 9 21
54 76 88 9 27
7
90 91 92 93 94 95 96
75
5
93 95 96 75 93
90 91 92 96 94 75 95

解題思路

使用 Vector 先將小雞的編號收起來,可以使用 Vector<int>::iterator 來判斷某一個編號的陣列位置為何,這樣就可以將老鷹的編號和被抓到的小雞編號進行互換。

範例程式碼-ZeroJudge F442: 老鷹抓小雞 Eagle

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;
    vector<int>chicken;
    for (int i = 0; i<N; i++)
    {
        int tmp;
        cin >> tmp;
        chicken.push_back(tmp);
    }
    int eagle;
    cin >> eagle;
    int Q;
    cin >> Q;
    for (int i = 0; i<Q; i++)
    {
        int tmp;
        cin >> tmp;
        vector<int>::iterator it = find(chicken.begin(), chicken.end(), tmp);
        if (it != chicken.end())
        {
            swap(eagle, chicken[distance(chicken.begin(), it)]);
        }
    }
    for (int i = 0; i<N; i++)
    {
        cout << chicken[i] << " ";
    }
    cout << "\n";
}

//ZeroJudge F442
//Dr. SeanXD

發佈留言