1. 程式人生 > 實用技巧 >數學基礎:博弈論問題

數學基礎:博弈論問題

簡單情況下可以手摸規律,找到規律後一般可以O(1)解決問題。例題:洛谷P4018、P4860。或者找出一定規律後進行遞推,並不是非要找出規律的表示式。

但是有的問題的規律比較複雜,涉及到數學推導過程......在此對見到的複雜博弈論問題進行整理

(1)nim遊戲

基本模型:有若干堆石子,每堆石子的數量都是有限的,合法的移動是“選擇一堆石子並拿走若干顆(不能不拿)”,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

令ai表示第i個石子堆內石子的個數。(a1,a2,...,aN)為奇異局勢當且僅當a1⊕a2⊕...⊕aN=0。

  • a1​⊕a2​⊕...⊕aN​=k=0,一定存在一步特定移動使得a1⊕a2⊕...⊕aN=0;
  • a1⊕a2⊕...⊕ai...⊕aN=0,不存在一步合法移動使得a1⊕a2⊕...⊕ai′...⊕aN​再次為0,
  • 當a1⊕a2⊕...⊕ai...⊕aN=0時,下一步必然為a1⊕a2⊕...⊕ai′...⊕aN!​=0

因此,誰面對奇異局勢,誰就是必輸的。至於說怎麼從非奇異局勢一步轉化為奇異局勢:

for(int i=1;i<=n;i++){
    if(k^a[i]<a[i]){
        printf("%d %d\n",i,a[i]-(k^a[i]));    //輸出在哪個位置上減多少
        a[i]=k^a[i];
        break;
    }
}

參考連結:https://www.luogu.com.cn/problem/solution/P1247

nim遊戲還有一些變種:階梯nim,共n階樓梯,每階樓梯上若干顆棋子,操作者輪流將某級樓梯上的若干顆棋子下移,只需考慮奇數階梯上棋子數求nim和進行判斷;n個格子排成一排,操作者每次可將一顆棋子向前移動,把每顆棋子到0號格的距離視為一堆棋子進行nim遊戲;一個矩陣棋盤,操作者每次分別在某一行操作一個黑白棋子對向移動,將每行黑白棋子的距離視為一堆棋子進行nim遊戲;

(2)威佐夫博弈

有兩堆各若干的物品,兩人輪流從其中一堆取至少一件物品,至多不限,或從兩堆中同時取相同件物品,規定最後取完者勝利。(看起來是比nim多了一種選擇)

結論:若兩堆物品的初始值為(x,y),且x<y,則另z=y-x;記w=(int)[((sqrt(5)+1)/2)*z ];若w=x,則先手必敗,否則先手必勝。

(3)斐波那契博弈

有一堆物品,兩人輪流取物品,先手最少取一個,至多無上限,但不能把物品取完,之後每次取的物品數不能超過上一次取的物品數的二倍且至少為一件,取走最後一件物品的人獲勝。

結論:先手勝當且僅當n不是斐波那契數(n為物品總數)