博弈遊戲彙總

2022-09-16 22:09:27 字數 2380 閱讀 8893

1、巴什博弈

一堆石子,有n個,兩個人輪流取,每次至少取1個,至多取m個,拿走最後乙個石子的人獲勝

假設一堆石子有  n=m+1  由於一次只能取m個,無論先手取多少個,後手總能拿走剩餘的,這時一定是先手負

於是找到取勝規則:

一對石子  n=(m+1)*r+s

對於先手應該先取走s個,設後手取走k個,先手再取走  m+1-k    剩餘的石子個數為  (m+1)(r-1)  以後保持這樣的取法,先取者獲勝

總之,就是要留給對手  m+1的倍數

可以歸結為:   s=0時,後手勝

s<>0時,先手勝

2、簡單的石子遊戲

有n堆石子,每次至少取一根,至多拿走整堆,兩人輪流拿,每次限拿其中一堆,取走最後一根的獲勝。

2023年獲勝策略已由美國數學家c.l.bouton分析完成,用到的是二進位制和平衡狀態概念。其結論是:

對於n堆石子,第i (1<=i<=n)堆石子的個數是xi,該狀態為必敗狀態當且僅當   x1 xor  x2 xor……xn=0。

看個例子:

有4堆石子,數量分別為:7   9   12   15

二進位制形式為

0111

1001

1100

1111

異或結果為:1101

1101^1001=0100=4     可以從第二堆拿走5個

1101^1100=0001=1     也可以從第三堆拿走11個

1101^1111=0010=2     或者從第四堆取走13個

比如這道題:

給定n堆石子,兩人輪流取石子,必須先取完一堆石子才能取另一堆,而且另一堆石子的個數必須比之前取的那一堆小,每次只能取1個或者質數個石子。如果沒有石子可以取了,那麼他就輸了。問先手是否有必勝策略。

其實對於這個遊戲,我們只需要判斷第一堆石子即可,也就是石子數目最少的那一堆

**:

#include#include

#include

using

namespace

std;

int isprime(int

n)

return1;

}int

main()

else

a[0]=a[0]+j; //

恢復石子數目

}

if(x!=0

) cout

<

<

}return0;

}

view code

3、nim遊戲

有n堆石子,每堆石子的數量為  x1, x2, x3,x4......xn。給定k個數a1,a2,a3,……ak  兩人輪流取,每人每次只能選取一堆,

從中取出一些,每次所取的數量一定在a1,a2,a3,……ak中,拿走最後一根的人獲勝。

我們可以將遊戲分解,把每一堆看成是乙個子遊戲。

比如,有3堆石子,每堆石子的數目,為5,6,7,可以取的石子的數目是 

可以找出每堆石子的所有後繼狀態,看成是n枚棋子在有向圖上移動,甲乙雙方人選乙個子遊戲並移動上面的棋子。

看起來狀態非常多,也很複雜,所以我們需要借鑑sg函式

首先定義乙個mex 運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。

對於乙個給定的有向無環圖,關於每個頂點的sg函式定義如下:

g(x)=mex;沒有出邊的頂點,sg值為0,因為它的後繼集合為空。

對於n枚棋子,它們對應頂點的sg值分別為:(a1,a2,……,an)再設局面  (a1,a2,……,an)時nim遊戲的一種必勝策略是  將ai變成k,那麼遊戲的一種必勝策略就是

把第i枚棋子移動到sg值為k的頂點上;

#includeusing

namespace

std;

/*輸入堆數 n,每堆的石子數a

輸入限定選擇的數目 k, 是s

*/int max(int a,int

n)

returnm;}

intmain()

for(int k=1;;k++) }}

int x=0

;

for(i=0;i)

x^=grund[a[i]];

if(x==0) cout<

先手勝"

<

else

cout

<

後手勝"

<

}return0;

}

view code

很好的部落格對博弈的解釋:

博弈知識彙總

顯然,如果n m 1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則 如果n m 1 r s,r為任意自然數,s m 那麼先取者要拿走s個物品,如果後取者拿走k m 個,那麼先取者再拿走m 1 k個,結果剩下 m 1 r...

組合遊戲(博弈)

昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...

博弈 塗色遊戲

在乙個2 n的格仔上,alice和bob又開始了新遊戲之旅。這些格仔中的一些已經被塗過色,alice和bob輪流在這些格仔裡進行塗色操作,使用兩種塗色工具,第一種可以塗色任意乙個格仔,第二種可以塗色任意乙個2 2的格仔。每一輪遊戲裡,他們可以選擇一種工具來塗色尚未被染色的格仔。需要注意,塗色2 2的...