基礎經典博弈

2021-10-23 09:12:22 字數 2816 閱讀 6701

1.巴什博弈

題目一般是兩人輪流每次在n個物品中拿取不超過m個且至少拿乙個,拿光者勝出。

我們可以將n個物品寫成k*(m+1)+b(b>0)所以先手先拿掉b個物品,後手只能拿x個物品(1<=x<=m),這時先手再拿m+1-x個物品,迴圈往復可以保證先手的人最後拿完物品,先手就必勝。當b==0時無論先手怎麼拿,後手只要保證同一回合兩人拿取的物品和等於m+1就可以確保後手必勝。

int n,m;

cin>>n>>m;

if(n%

(m+1)!=

0)cout<<

"first win"

<

else cout<<

"second win"

<

2.威佐夫博弈

int n,m;

double x=

(sqrt(5

)+1)

/2.0

;while(~

scanf

("%d %d"

,&n,

&m))

3.斐波那契博弈一般題目是在一堆n個數量的物品中兩人輪流取,每次至少取1個,但是每次取的數量不能超過上次取的數目的兩倍(n>=2且第一次取的時候不能取完)。

一般這樣問的都是斐波那契博弈,我們只需要記住n是斐波那契數的時候先手必敗。

ll a[60]

,n; a[0]

=1; a[1]

=1;for

(int i=

2;i<=

50;i++

)//可以滿足n在int範圍內

a[i]

=a[i-1]

+a[i-2]

;while(~

scanf

("%lld"

,&n)

)

斐波那契博弈證明

4.尼姆博弈

題目一般是在n堆物品中,每人每次只能在一堆裡面至少拿乙個,無上限,當取完最後乙個時該人獲勝。

結論:對每一堆的數量進行異或運算,當結果是0時先手必敗。

int t;

while(~

scanf

("%d"

,&t))if

(res==0)

printf

("second win\n");

else

printf

("first win\n");

}

當我們要使先手必勝時,首先得滿足所有值異或不等於0,然後可以將其中乙個值o變成其他值異或的值p,其中o應當大於p(從o個物品中拿出x個餘下p個);

比如有5堆,數量分別是1,2,3,4,5;

1 xor 2 xor 3 xor 4 xor 5 = 1;

現在對5進行操作。

1 xor 2 xor 3 xor 4 = 4;//其他值的異或值

1 xor 2 xor 3 xor 4 xor 4 = 0;//將5中拿去1剩下4,異或後變成0;

//給你n個數,求若先手必勝則他第一步有幾種選擇

int n,a[

110]

,ans=

0,cnt=0;

scanf

("%d"

,&n)

;for

(int i=

0;i)for

(int i=

0;i)printf

("%d\n"

,cnt)

;

5.反尼姆博弈題目一般是在n堆物品中,每人每次只能在一堆裡面至少拿乙個,無上限,當取完最後乙個時該人失敗。

計算所有堆中充裕堆的數目cnt(充裕堆指每堆的數量大於1),以及所有堆數量的異或ans;

如果ans == 0 && cnt == 0或者ans != 0 && cnt != 0先手必勝,否則後手必勝。

int ans=

0,cnt=

0,n,num;

scanf

("%d"

,&n)

;for

(int i=

0;i(ans==

0&&cnt==

0||ans!=

0&&cnt!=0)

printf

("first win\n");

else

printf

("second win\n"

);

我們可以參考這張理解反尼姆博弈。

根據這張我們可以進行總結。令ans為所有堆的異或和,cnt為充裕堆的數量。由上述可知t0,s1,s2狀態下先手必勝。

t0:ans==0 && cnt == 0;

s1:ans!=0 && cnt == 1;

s2:ans!=0 && cnt >= 2;

由上可知當先手必勝時ans == 0 && cnt == 0 || ans != 0 && cnt! =0

尼姆博弈與反尼姆博弈證明

幾個經典的博弈

一 巴什博奕 bash game 只有一堆 n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取 m個。最後取光者得勝。顯然,如果 n m 1 那麼由於一次最多只能取 m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則 如果n m 1...

幾個經典的博弈

一 巴什博奕 bash game 只有一堆 n 個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取 m 個。最後取光者得勝。顯然,如果 n m 1 那麼由於一次最多只能取 m 個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則 如果 n...

幾個經典的博弈問題

有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個 人輪流從堆中取物體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲 別看這遊戲極其簡單,卻蘊含著深刻的數學原理。下面我們來分析一下要如何才能夠 取勝。一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流...