【博弈论】威佐夫博弈
簡(jiǎn)介
威佐夫博弈( W y t h o f f G a m e Wythoff\ Game Wythoff?Game):有兩堆物品個(gè)數(shù)是 n n n和 m m m,甲乙兩個(gè)人輪流從一堆選取 k k k個(gè)物品或兩堆中選取各選取 k k k個(gè)物品,最后取完物品的人獲勝。
思路
兩堆物品數(shù)用 ( n , m ) (n,m) (n,m)表示,滿足 n ≤ m n\le m n≤m,如果 n > m n>m n>m則交換 n n n與 m m m。
現(xiàn)考慮各種狀態(tài),發(fā)現(xiàn)先手必輸態(tài)如下:
當(dāng) n = 0 n=0 n=0時(shí),
( 0 , 0 ) (0,0) (0,0)沒(méi)有物品甲必?cái)?
( 0 , m ≠ 0 ) (0,m\ne 0) (0,m?=0)有物品甲必勝。
當(dāng) n = 1 n=1 n=1時(shí),
( 1 , 2 ) (1,2) (1,2)會(huì)變成乙選 ( 0 , 1 ) (0,1) (0,1), ( 0 , 2 ) (0,2) (0,2)或 ( 1 , 1 ) (1,1) (1,1),甲必?cái)?
( 1 , m ≠ 2 ) (1,m\ne 2) (1,m?=2)有物品甲必勝利。
當(dāng) n = 2 n=2 n=2時(shí),
( 2 , m ) (2,m) (2,m)變成乙選 ( 0 , 2 ) (0,2) (0,2)或 ( 1 , 2 ) (1,2) (1,2),甲必勝。
當(dāng) n = 3 n=3 n=3時(shí),
( 3 , 5 ) (3,5) (3,5)甲必?cái)?#xff0c;
( 3 , m ≠ 5 ) (3,m\ne 5) (3,m?=5)甲必勝。
進(jìn)一步推算可以發(fā)現(xiàn)所有的先手必?cái)【譃?span id="ozvdkddzhkzd" class="katex--inline"> ( 0 , 0 ) (0,0) (0,0), ( 1 , 2 ) (1,2) (1,2), ( 3 , 5 ) (3,5) (3,5), ( 4 , 7 ) (4,7) (4,7), ( 6 , 10 ) … (6,10)\dots (6,10)…
這種先手必?cái)【纸凶銎娈惥謩?shì),可以發(fā)現(xiàn)第 k k k項(xiàng)的 n n n是前 k ? 1 k-1 k?1項(xiàng)中未出現(xiàn)的最小正整數(shù) i i i,而 m = i + k m=i+k m=i+k。
每個(gè)人要想獲勝就是盡量使對(duì)方變成奇異局勢(shì)。
根據(jù)相關(guān)資料可以得知第 k k k項(xiàng)奇異局勢(shì)的 n k = k ( ( 5 ) + 1 ) 2 , m k = n k + k n_k=\frac{k(\sqrt(5)+1)}{2},m_k=n_k+k nk?=2k((?5)+1)?,mk?=nk?+k。
bool Wythoff(int n,int m){//判斷先手且為n,m時(shí)是否取勝 if(n>m) return Wythoff(m,n);//保證n<=m int k=m-n;//計(jì)算出項(xiàng)數(shù)k int _n=k*(sqrt(5)+1)/2.0;//計(jì)算出必?cái)r(shí)的n return n!=_n;//判斷是否必?cái)? }例題
hdu1527
題目描述
有兩堆石子,數(shù)量任意,可以不同。游戲開(kāi)始由兩個(gè)人輪流取石子。游戲規(guī)定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時(shí)取走相同數(shù)量的石子。最后把石子全部取完者為勝者。現(xiàn)在給出初始的兩堆石子的數(shù)目,如果輪到你先取,假設(shè)雙方都采取最好的策略,問(wèn)最后你是勝者還是敗者。
輸入
輸入包含若干行,表示若干種石子的初始情況,其中每一行包含兩個(gè)非負(fù)整數(shù)a和b,表示兩堆石子的數(shù)目,a和b都不大于1,000,000,000。
輸出
輸出對(duì)應(yīng)也有若干行,每行包含一個(gè)數(shù)字1或0,如果最后你是勝者,則為1,反之,則為0。
樣例輸入
2 1 8 4 4 7樣例輸出
0 1 0參考代碼
#include <iostream> #include <cmath> using namespace std; bool Wythoff(int n,int m){//判斷先手且為n,m時(shí)是否取勝 if(n>m) return Wythoff(m,n);//保證n<=m int k=m-n;//計(jì)算出項(xiàng)數(shù)k int _n=k*(sqrt(5)+1)/2.0;//計(jì)算出必?cái)r(shí)的n return n!=_n;//判斷是否必?cái)? } int main(){int n,m;while(cin>>n>>m){cout<<Wythoff(n,m)<<endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的【博弈论】威佐夫博弈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 再谈6G
- 下一篇: 老机械设计工程师的工作心得