博弈 一些簡單的博弈

2021-08-15 13:41:30 字數 2520 閱讀 1548

下面總結了一些簡單的博弈題目:

1、有一堆石子共有n個,a和b輪流取,a先,每次最少取1個,最多取m個,

先取完者勝

,a,b足夠聰明,問誰先勝?(巴什博奕)

思路:顯然,如果n=m+1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。

所以若n%(m+1)!=0,a勝,否則b勝。

這個遊戲還可以有一種變相的玩法:兩個人輪流報數,每次至少報乙個,最多報十個,誰能報到100者勝。

100=(10+1)*9+1,對應上述方法解答即可。

對於巴什博弈,那麼我們規定,如果

最後取光者輸

,那麼又會如何呢?

(n-1)%(m+1)==0則後手勝利

先手會重新決定策略,所以不是簡單的相反能行的。

例:n=16  m=4

無論先手怎麼取,後手始終可以取到(m+1)*t+1(t是整數)

第一次先手取後:後手取到n=11

第二次先手取後:後手取到n=6

第三次先手取後:後手取到n=1

所以先手敗。

而(16-1)%(4+1)==0成立

而當 (n-1)%(m+1)!=0時,先手可以將狀態取到對自己有利的狀態。

例:n=17 m=4

先手取1,使n=16,當前局面變成上述例子的局面。所以先手勝利。

2、n個石子擺成一圈,a和b輪流取,每次可以從中取乙個或相鄰兩個,先取完者勝,a先取,問誰勝?(始終讓剩下的棋子對稱)

若n==1||n==2 則a勝,否則b勝

3、有n堆石子,每堆石子都有任意個,a和b輪流從取任意堆裡取一定的石子,每次只能從一堆裡至少取乙個,a先取,

先取完者勝,問誰勝?(nimm博弈)

將n個數異或一遍,若不為0,則a勝,否則b勝

4、n堆石子,2人博弈.每次選擇一堆石子,移除至少乙個(可以是任意多個)後,將剩下的任意分配(當然也可以什麼都不做),2人輪流操作,不能操作者輸.求先手必勝還是必敗?

解:如果只有一堆石子,則先手必勝.如果有兩堆相同數目的石子,顯然先手必敗,因為對手只需對稱操作即可.同理可知,如果石子可分為兩組,對應堆石子數相等,如,則先手同樣必敗,於是數目相同的兩堆先可以暫不考慮.如果有兩堆數目不同的石子,則先手可以使之數目相同,先手必勝.如果有三堆互不相同的石子,先手可以選擇最大的一堆操作,移除一部分後,使剩下的石子正好補齊剩下兩堆之間的差距,先手必勝.依次類推,先手必敗當且僅當初始時石子數是這種型別。

所以,要做的就是判斷出現的石子數型別是否是偶數,當所有型別都是偶數時,說明石子是可以對稱的。那麼先手必敗,反之,先手必勝

。共有n堆石子,已知每堆中石子的數量,兩個人輪流取石子,每次只能選擇n堆石子中的一堆取一定數量的石子(最少取乙個),取過子之後,還可以將該堆石子中剩餘的石子隨意選取幾個放到其它的任意一堆或幾堆上。等哪個人無法取子時就表示此人輸掉了遊戲。注意:一堆石子沒有子之後,就不能再往此處放石子了。

假設每次都是小牛先取石子,並且遊戲雙方都絕對聰明,現在給你石子的堆數、每堆石子的數量,請判斷出小牛能否獲勝。

#include #include using namespace std;

int main()

int flag=0;

for (int i = 0; i < 101; i++)

}if (flag)

cout << "win" << endl;

else

cout << "lose" << endl;

} system("pause");

return 0;

}5、有一堆石子,a和b輪流從中取一定的石子,但規定:第一次不能取完,至少乙個;從第二次開始,每個人取的石子數至少為1,至多為對手剛取的石子數的兩倍。a先取,問a是否會勝?

結論:若其對應的石子數目剛好是斐波那契數,則a必敗,否則a必勝。(斐波拉契博弈)

幼兒園開學了,為了讓小盆友們能盡可能的多的享受假期。校長大人決定讓小盆友分批到校,至於每批學生來多少人由乙個小傻子和乙個小仙女負責,兩個人輪番負責,校長會在最後的時候去檢視工作進度,小傻子不想被別人嘲笑自己傻,小仙女要證明自己比小傻子聰明。所以她們回去爭搶安排最後一名小盆友。每次安排的小盆友至少為1,至多為上一次安排的2倍。小仙女搶到了先手的機會。第一次安排小盆友不能直接安排所有的小盆友一起回校。

單組測試資料

輸入乙個整數n——n代表小盆的個數(n>=2&&n<=1e9)

輸出獲勝人的名字——「xian」或者「sha」

#include using namespace std;

int main()

cout << "xian" << endl;

system("pause");

return 0;

}

部分來自:取石子總結)

一些博弈題

題目鏈結 題面較長,這裡不貼圖了 一道比較基礎的博弈題,關鍵在於,如果起始點距離與0邊相連點之間存在奇數條邊時則先手存在必勝策略,反之則先手必敗。include include include include include include include include include inclu...

博弈論的一些結論

感謝 自從昨天考了博弈論的一道程式填空題,博弈論的陰雲便一直在我的心上徘徊,今天把這個坑填一下。一.巴什博弈 bash game a和b一塊報數,每人每次最少報乙個,最多報四個,看誰先報到三十.這應該是最古老的關於巴什博弈的遊戲了吧。其實如果知道原理,這遊戲一點運氣成分都沒有,只和先後手有關,比如第...

簡單博弈論 一些刷題指南

1.簡單博弈論 nim遊戲補充 這樣的遊戲被稱為nim遊戲 1 有兩個玩家,輪流進行操作 2 是公平遊戲。即面對同一局面兩個玩家所能進行的操作是相同的。例如中國象棋 不是公平遊戲。因為面對同乙個局面,紅方只能移動紅色棋子而不能移動黑方棋子,黑房同理。3 乙個玩家是輸掉當且僅當他無法進行操作。例如如果...