1. 程式人生 > >博弈論-巴什博奕

博弈論-巴什博奕

巴什博奕(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勝。