題目連結: https://zerojudge.tw/ShowProblem?problemid=c297

# 題目

有點長,所以只放連結喔~

# 思路

安打時,除了原本在壘包上的人要移動外,還要加上一個從本壘走出來的人。例如 2B:原本在壘上的人往前跑 2 個壘,而本壘的人跑到 2 壘。
打出 2 壘安打時,可以想成每個人都往前進一格兩次
打出 3 壘安打時,可以想成每個人都往前進一格三次
全壘打時,跑 4 個壘就相當於原本壘上的所有人皆得分,還要外加本壘出來的人的分數。
在用 queue 模擬時,沒有人的地方可以假設為數字 0有人的地方假設為數字 1(或其他數字)。
跑壘時讀到人(也就是數字 1)=> 得分

部分模擬的題目,也可以到很難喔~這可是 APCS 的第四題ㄟ

# 程式碼

#include <bits/stdc++.h>
using namespace std;
map<int, queue<string> > mp;// 紀錄用,也可以用二維陣列代替
 
int main(){
    int a, target;
    string s;
     
    for (int i=0; i<9; i++){
        cin >> a;
        queue <string> q;
        for (int j=0; j<a; j++){
            cin >> s;
            q.push(s);
        }
        mp[i] = q;
    }
    cin >> target;
 
    int out = 0, num = -1, score = 0;
    int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
    while (1){
        int times = 0; // 跑壘數
        num = (num + 1) % 9; // 打者號碼
        string hit = mp[num].front();
        mp[num].pop();
        if (hit == "SO" || hit == "GO" || hit == "FO"){
            out += 1;
            if (out == target) break;
            if (out % 3 == 0){
                b1 = b2 = b3 = b4 = 0;
            }
        } else if (hit == "HR"){
            times = 4;
        } else {
            times = hit[0] - '0';
        }
        // 跑壘
        for (int i=1; i<=times; i++){
            b4 = b3;
            b3 = b2;
            b2 = b1;
            if (i == 1) b1 = 1;
            else b1 = 0;
            if (b4 == 1) {
                score++;
            }
        }
    }
    cout << score << '\n';
    return 0;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay