ZeroJudge C297: 棒球遊戲

謙謙最近迷上棒球,他想自己寫一個簡化的遊戲計分程式。這會讀入隊中每位球員的打擊結果,然後計算出球隊得分。

 這是個簡化版的模擬,假設擊球員打擊結果只有以下情況:

  • 安打:以「1B、2B、3B、和HR」分別代表「一壘打」、「二壘打」、「三壘打」和「全 (四) 壘打」。
  • 出局:以「FO、GO、和SO」表示。

這個簡化版的規則如下:

  • 球場上有四個壘包,稱為本壘、一壘、二壘、和三壘。
  • 站在本壘握著球棒打球的稱為「擊球員」,站在另外三個壘包的稱為「跑壘員」。
  • 當擊球員的打擊結果為「安打」時,場上球員 (擊球員與跑壘員) 可以移動;結果為 「出局」時,跑壘員不動,擊球員離場換下一位擊球員。
  • 球隊總共有九位球員,依序排列 。比賽開始由第1位開始打擊,當第 i 位球員打擊完畢後,由第 (i + 1) 位球員擔任擊球員。當第九位球員完畢後,則輪回第一位球員。
  • 當打出 K 壘打時,場上球員 (擊球員和跑壘員) 會前進 K 個壘包。從本壘前進一個壘包會移動到一壘,接著是二壘、三壘,最後回到本壘。
  • 每位球員回到本壘時可得 1 分。
  • 每達到三個出局數時,一、二和三壘就會清空 (跑壘員都得離開),重新開始。

請寫出具備這樣功能的程式,計算球隊總得分。

範例測資

範例輸入範例輸出
每組測試資料固定有十行。

第 1 到 9 行,依照球員順序,每一行代表一位球員的打擊資訊。每一行開始有一個正整數 a (1 ≤ a ≤ 5),代表球員總共打了 a 次。接下來有 a 個字串 (均為兩個字元),依序代表每次打擊的結果。 資料之間均以一個空白字元隔開。球員的打擊資訊不會有錯誤也不會缺漏。

第 10 行有一個正整數 b (1 ≤ b ≤ 27) ,表示我們想要計算當總出局數累計到 b 時, 該球隊的得分。輸入的打擊資訊中至少包含 b 個出局。
計算在總計第 b 個出局數發生時的總得分,並將此得分輸出於一行。
5 1B 1B FO GO 1B
5 1B 2B FO FO SO
4 SO HR SO 1B
4 FO FO FO HR
4 1B 1B 1B 1B
4 GO GO 3B GO
4 1B GO GO SO
4 SO GO 2B 2B
4 3B GO GO FO
3
0
5 1B 1B FO GO 1B
5 1B 2B FO FO SO
4 SO HR SO 1B
4 FO FO FO HR
4 1B 1B 1B 1B
4 GO GO 3B GO
4 1B GO GO SO
4 SO GO 2B 2B
4 3B GO GO FO
6
5
ZeroJudge C297 範例測資

解題思路

將資料收完之後可以判斷現在的打者是幾壘安打,然後從第三壘開始判斷。假如現在是一壘安打的話三壘的人就會跑回本壘,分數就會 +1,然後三壘會清空。然後再來判斷二壘,如果二壘有人的話就會跑到三壘然後二壘清空,以此類推。需要注意的是當出局數為 3 的倍數時需清掉所有壘上的人

範例程式碼-ZeroJudge C297: 棒球遊戲

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

int rtn(string str)
{
    if (str[0] == '1') return 1;
    if (str[0] == '2') return 2;
    if (str[0] == '3') return 3;
    if (str[0] == 'H') return 4;
    else return -1;
}

int main() {
    vector<vector<int>>all;
    int max = -999;
    for (int i = 0; i<9; i++)
    {
        int N;
        cin >> N;
        if (N > max) max = N;
        vector<int>score;
        for (int j = 0; j<N; j++)
        {
            string str;
            cin >> str;
            score.push_back(rtn(str));
        }
        all.push_back(score);
    }
    int N;
    cin >> N;
    vector<int>base;
    base.push_back(0);
    base.push_back(0);
    base.push_back(0);
    base.push_back(0);
    int score = 0;
    int out = 0;
    for (int i = 0; i<max; i++)
    {
        for (int j = 0; j<9; j++)
        {
            int aa = all[j][i];
            if (aa == 1)
            {
                if (base[3] == 1)
                {
                    score++;
                    base[3] = 0;
                }
                if (base[2] == 1)
                {
                    base[3] = 1;
                    base[2] = 0;
                }
                if (base[1] == 1) base[2] = 1;
                base[1] = 1;
            }
            else if (aa == 2)
            {
                if (base[3] == 1)
                {
                    score++;
                    base[3] = 0;
                }
                if (base[2] == 1)
                {
                    score++;
                    base[2] = 0;
                }
                if (base[1] == 1)
                {
                    base[1] = 0;
                    base[3] = 1;
                }
                base[2] = 1;
            }
            else if (aa == 3)
            {
                if (base[3] == 1)
                {
                    score++;
                    base[3] = 0;
                }
                if (base[2] == 1)
                {
                    score++;
                    base[2] = 0;
                }
                if (base[1] == 1)
                {
                    score++;
                    base[1] = 0;
                }
                base[3] = 1;
            }
            else if (aa == 4)
            {
                score++;
                if (base[1] == 1) score++;
                if (base[2] == 1) score++;
                if (base[3] == 1) score++;
                base[1] = 0;
                base[2] = 0;
                base[3] = 0;
            }
            else if (aa == -1)
            {
                out++;
                if (out == N)
                {
                    cout << score << "\n";
                    break;
                }
                if (out % 3 == 0)
                {
                    base[1] = 0;
                    base[2] = 0;
                    base[3] = 0;
                }
            }
        }
        if (out == N)
        {
            break;
        }
    }
}

//ZeroJudge C297
//Dr. SeanXD

發佈留言