謙謙最近迷上棒球,他想自己寫一個簡化的遊戲計分程式。這會讀入隊中每位球員的打擊結果,然後計算出球隊得分。
這是個簡化版的模擬,假設擊球員打擊結果只有以下情況:
- 安打:以「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 |
解題思路
將資料收完之後可以判斷現在的打者是幾壘安打,然後從第三壘開始判斷。假如現在是一壘安打的話三壘的人就會跑回本壘,分數就會 +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