一. 巴什博奕(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個,最後取光者為勝。
**如下:
[cpp]
view plain
copy
#include
using
namespace
std;
intmain()
例題有:hdu4764 stone:
題目大意:tang和jiang輪流寫數字,tang先寫,每次寫的數x滿足1<=x<=k,jiang每次寫的數y滿足1<=y-x<=k,誰先寫到不小於n的數算輸。
結論:r=(n-1)%(k+1),r=0時jiang勝,否則tang勝。
二. 威佐夫博弈(wythoff game):
有兩堆各若干的物品,兩人輪流從其中一堆取至少一件物品,至多不限,或從兩堆中同時取相同件物品,規定最後取完者勝利。
直接說結論了,若兩堆物品的初始值為(x,y),且x
記w=(int)[((sqrt(5)+1)/2)*z ];
若w=x,則先手必敗,否則先手必勝。
**如下:
[cpp]
view plain
copy
#include
#include
#include
using
namespace
std;
intmain()
return
0;
}
三. 尼姆博弈(nimm game):
尼姆博弈指的是這樣乙個博弈遊戲:有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。
結論就是:把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。
**如下:
[cpp]
view plain
copy
#include
#include
#include
using
namespace
std;
intmain()
if(temp==0) cout<<
"後手必勝"
<
else
cout<<
"先手必勝"
<
} return
0;
}
四. 斐波那契博弈:
有一堆物品,兩人輪流取物品,先手最少取乙個,至多無上限,但不能把物品取完,之後每次取的物品數不能超過上一次取的物品數的二倍且至少為一件,取走最後一件物品的人獲勝。
結論是:先手勝當且僅當n不是斐波那契數(n為物品總數)
如hdu2516
[cpp]
view plain
copy
#include
#include
#include
using
namespace
std;
const
intn = 55;
intf[n];
void
init()
intmain()
}
if(flag) puts(
"second win"
);
else
puts(
"first win"
);
}
return
0;
}
博弈論演算法
複習 兩個頂尖聰明的人在玩遊戲,有一堆n個石子,每次每個人能取 1,m 個石子,不能拿的人輸,請問先手與後手誰必敗?結論 通過上面的分析可以得出結論 當n能整除m 1時先手必敗,否則先手必勝。兩個頂尖聰明的人在玩遊戲,有nn堆石子,第ii堆有aiai個,每人每次能從一堆石子中取任意多個石子但不能不取...
博弈論 演算法
博弈論主要研究公式化了的激勵結構間的相互作用,是研究具有鬥爭或競爭性質現象的數學理論和方法。博弈論考慮遊戲中的個體的 行為和實際行為,並研究它們的優化策略。如囚徒困境 鏈結 在演算法競賽 現的博弈論題目通常是icg 公平組合遊戲 的,有如下特徵 1.有兩名選手。2.兩名選手交替操作,每次一步,每步都...
演算法 簡單博弈論
僅有一堆n個物品,兩個人輪流取1 m個,最後取的人勝 不能取的人輸 總體可分幾種情況 int bash game int n,int m 是否先手有必贏策略 將一堆變為多堆 即 有3堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取1個,多者不限,最後取光者得勝。本部分含其他部落格內容...