ZeroJudge C297: 棒球遊戲

題目敘述

每個測資都只有10行,前九行每行有一個正整數N,接下來會有N個字串,分別代表這一個打者每一次打球的結果。每次打擊都是從第一位打者打到第九位打者接下來回到第一位。最後一行有一個正整數B代表要輸出當出局數累計到B時的分數,每三次出局的時候所有壘包都會清空。

以下為每個字串的意思:

(1) 安打:以1B,2B,3B和HR 分別代表一壘打、二壘打、三壘打和全(四)壘打。


(2) 出局:以 FO,GO和 SO表示。


範例輸入 #1

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

範例輸出 #1

0


範例輸入 #2

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

範例輸出 #2

5


解題思路

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

解題程式碼如下 (僅供參考):

#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 M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge A263: 日期差幾天