# String Manipulation# Conditional Logic# Simulation

d157 - 序章-永夜抄-B

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個猜拳遊戲,由十六夜、紅美鈴和帕秋莉進行。輸入為一系列的猜拳結果,每局包含三人的出拳,以逗號分隔。出拳可以是 "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 << "繼續做家事";
}

Discussion