1. 程式人生 > >簡單博弈之巴什博弈

簡單博弈之巴什博弈

例題:

Guns和Roses是兩個好朋友,這一天他們比賽吃葡萄。假定他們有ANS顆葡萄。

在比賽之前他們會首先確定每次吃葡萄的數量的最大值為S,和ANS的具體值。

兩個人輪流吃葡萄,每次最多吃S顆,不能不吃。(即假定每次吃M顆葡萄,則 1<=M<=S)

遊戲規定在誰吃完葡萄後,他們兩個人所吃的葡萄總和等於ANS,誰就獲勝。

假定他們兩人足夠聰明,在吃葡萄的過程中都不會使值大於ANS。

現在規定Guns先手,請你幫助他計算為了確保最終取得勝利,他第一次應該吃多少顆葡萄?

若第一次無論吃多少顆葡萄,最終都無法取得勝利,請你輸出 -1 。

解題思路:

就是遞推,如果先手想要獲得勝利,那麼就需要在先手倒數第二次取的時候,還剩下(1+s)顆,這樣的話,無論後面的人如何取,都一定輸了。分析這個樣例 ans=9,s=4.倒著分析,如果要想達到還剩4+1顆時,也就是第一次先手拿了四顆,這樣的話,無論後手拿多少顆,剩下的顆數一定小於5,那麼先手穩贏。 

程式碼:

#include<bits/stdc++.h>
using namespace std;
int main(){
int ans,s;
while(cin>>ans>>s){
int temp1=s+1;
int temp2=ans%temp1;
if(temp2==0){
cout<<-1<<endl;
}
else
cout<<temp2<<endl;
}
return 0;
}