題目連結: 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; | |
} |