d157 - 序章-永夜抄-B
題目描述
題目描述了一個猜拳遊戲,由十六夜、紅美鈴和帕秋莉進行。輸入為一系列的猜拳結果,每局包含三人的出拳,以逗號分隔。出拳可以是 "Scissors" (剪刀), "Stone" (石頭), "Paper" (布),或者任意其他字符串表示不滿。程式需要模擬遊戲過程,判斷每一局的勝負,並計算每個人的勝場數。遊戲結束的標誌是輸入 "Game Over",然後輸出每個人的總勝場數,並根據勝場數判斷結局。
解題思路
程式的主要邏輯是解析每一行的輸入,判斷每一局的勝負。如果有人出的是非 "Scissors", "Stone", "Paper" 的字符串,則該人直接獲勝。如果三人都出的是有效的拳,則根據猜拳的規則判斷勝負。如果平手,則輸出平手。如果只有一個人獲勝,則輸出該人獲勝。如果有多個獲勝者,則輸出輸家。程式使用一個 ans 陣列來記錄每個人的勝場數,並在遊戲結束後輸出結果和結局。
複雜度分析
- 時間複雜度: O(N),其中 N 是輸入的局數。程式需要遍歷每一行輸入,並進行常數時間的操作。
- 空間複雜度: O(1),程式使用了一個固定大小的
ans陣列來記錄勝場數,空間複雜度為常數。
程式碼
#include <iostream>
using namespace std;
int ans[3];
int main(){
cin.tie(0); ios::sync_with_stdio(false);
int ca=0;
string a;
while(getline(cin,a)){
if(a=="Game Over")break;
++ca;
string tmp;int t[3]={0},it=0;a+=',';
for(int i=0;i<3;++i,++it,tmp.clear()){
while(a[it]!=',')tmp+=a[it++];
if(tmp=="Scissors")t[i]=1;
else if(tmp=="Stone")t[i]=2;
else if(tmp=="Paper")t[i]=3;
else t[i]=4;
}
if(t[0]==4){
++ans[0];
cout << "十六夜贏了第" << ca << "局的比賽\n";
}
else if(t[1]==4){
++ans[1];
cout << "紅美鈴贏了第" << ca << "局的比賽\n";
}
else if(t[2]==4){
++ans[2];
cout << "帕秋莉·諾雷姬贏了第" << ca << "局的比賽\n";
}
else if(t[0]+t[1]+t[2]==6||(t[0]==t[1]&&t[1]==t[2]))
cout << "第" << ca << "局不分勝負\n";
else if((t[0]-t[1]==1&&t[1]==t[2])||(t[0]==1&&t[1]==3&&t[2]==3)){
cout << "十六夜贏了第" << ca << "局的比賽\n";
++ans[0];
}
else if((t[1]-t[0]==1&&t[0]==t[2])||(t[1]==1&&t[0]==3&&t[2]==3)){
cout << "紅美鈴贏了第" << ca << "局的比賽\n";
++ans[1];
}
else if((t[2]-t[1]==1&&t[1]==t[0])||(t[2]==1&&t[1]==3&&t[0]==3)){
cout << "帕秋莉·諾雷姬贏了第" << ca << "局的比賽\n";
++ans[2];
}
else if((t[1]-t[0]==1&&t[1]==t[2])||(t[0]==3&&t[1]==1&&t[2]==1)){
cout << "十六夜輸了第" << ca << "局的比賽\n";
++ans[1];++ans[2];
}
else if((t[2]-t[1]==1&&t[0]==t[2])||(t[1]==3&&t[0]==1&&t[2]==1)){
cout << "紅美鈴輸了第" << ca << "局的比賽\n";
++ans[0];++ans[2];
}
else{
cout << "帕秋莉·諾雷姬輸了第" << ca << "局的比賽\n";
++ans[0];++ans[1];
}
}cin >> a;
cout << "十六夜總計贏了" << ans[0] << "局比賽\n" << "紅美鈴總計贏了" << ans[1] << "局比賽\n" << "帕秋莉·諾雷姬總計贏了" << ans[2] << "局比賽\n";
(ans[0]==max(ans[0],max(ans[1],ans[2])))?cout << "趕上旅程":cout << "繼續做家事";
}