# Greedy# Simulation# Conditional Logic

h026 - 202001_1 猜拳

🔗 前往 ZeroJudge 原題

題目描述

本題模擬一個猜拳遊戲,哥哥根據妹妹的出拳策略來決定自己的出拳策略。哥哥的策略是:如果妹妹連續兩次出相同的拳,則哥哥出能打敗妹妹前兩次出拳的拳;否則,哥哥出與妹妹前一次相同的拳。程式需要模擬遊戲過程,並輸出哥哥每一回合的出拳以及分出勝負的回合數。

解題思路

這題主要使用模擬的方法來解決。程式需要記錄哥哥和妹妹的出拳,並根據哥哥的策略來決定下一回合的出拳。在每一回合中,比較哥哥和妹妹的出拳,判斷是否分出勝負。如果分出勝負,則輸出結果並結束程式;如果沒有分出勝負,則繼續下一回合。

複雜度分析

  • 時間複雜度: O(n),其中 n 是妹妹準備的出拳數量。程式需要模擬 n 回合的遊戲,每一回合的時間複雜度為 O(1)。
  • 空間複雜度: O(1)。程式只需要記錄少數變數,例如哥哥的出拳、妹妹的出拳、回合數等,空間複雜度為常數。

程式碼

#include <iostream>
using namespace std;
int f,n,y,rd=1,w,la=-1;
int main(){
	cin >> f >> n;
	while(rd<=n){
		cin >> y;
		cout << f << " ";
		if(f!=y){
			if((f==5&&y==0)||(f==2&&y==5)||(f==0&&y==2))w=1;
			else w=-1;
			break;
		}
		f=y;
		if(la==y){
			if(y==0)f=5;
			else if(y==5)f=2;
			else f=0;
		}
		la=y;
		++rd;
	}
	if(w==1){
		cout << ": Won at round " << rd;
	}
	else if(w==-1){
		cout << ": Lost at round " << rd;
	}
	else {
		cout << ": Drew at round " << rd-1;
	}
}

Discussion