博弈論-巴什博奕
阿新 • • 發佈:2018-11-11
巴什博奕(Bash Game):
A和B一塊報數,每人每次報最少1個,最多報4個,看誰先報到30。這應該是最古老的關於巴什博奕的遊戲了吧。
其實如果知道原理,這遊戲一點運氣成分都沒有,只和先手後手有關,比如第一次報數,A報k個數,那麼B報5-k個數,那麼B報數之後問題就變為,A和B一塊報數,看誰先報到25了,進而變為20,15,10,5,當到5的時候,不管A怎麼報數,最後一個數肯定是B報的,可以看出,作為後手的B在個遊戲中是不會輸的。
那麼如果我們要報n個數,每次最少報一個,最多報m個,我們可以找到這麼一個整數k和r,使n=k*(m+1)+r,代入上面的例子我們就可以知道,如果r=0,那麼先手必敗;否則,先手必勝。
巴什博奕:只有一堆n個物品,兩個人輪流從中取物,規定每次最少取一個,最多取m個,最後取光者為勝。
程式碼:
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
if(n%(m+1)==0) cout<<"後手必勝"<<endl;
else cout<<"先手必勝"<<endl;
return 0;
}
例題有:HDU4764 Stone:
題目大意:Tang和Jiang輪流寫數字,Tang先寫,設前一個人寫的數為x,他之後寫的數為y,則總是滿足1<=y-x<=k,也就是兩個人寫的數的差值m一定滿足1<=m<=k,第一個人寫的數滿足1<=x<=k,Jiang每次寫的數y滿足1<=y-x<=k,誰先寫到不小於n的數算輸。
結論:r=(n-1)%(k+1),r=0時Jiang勝,否則Tang勝。