h026 - 202001_1 猜拳
題目描述
本題模擬一個猜拳遊戲,哥哥根據妹妹的出拳策略來決定自己的出拳策略。哥哥的策略是:如果妹妹連續兩次出相同的拳,則哥哥出能打敗妹妹前兩次出拳的拳;否則,哥哥出與妹妹前一次相同的拳。程式需要模擬遊戲過程,並輸出哥哥每一回合的出拳以及分出勝負的回合數。
解題思路
這題主要使用模擬的方法來解決。程式需要記錄哥哥和妹妹的出拳,並根據哥哥的策略來決定下一回合的出拳。在每一回合中,比較哥哥和妹妹的出拳,判斷是否分出勝負。如果分出勝負,則輸出結果並結束程式;如果沒有分出勝負,則繼續下一回合。
複雜度分析
- 時間複雜度: 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;
}
}