博弈論 Nim遊戲

2021-10-20 01:29:57 字數 3479 閱讀 8982

這種遊戲稱為nim博弈,遊戲過程中面臨的狀態成為局面

n im

nimni

m博弈不存在平局,只有先手必勝先手必敗兩種情況。定理nim

博弈先手

必勝,當

且僅當a

1xora2

xor⋯

xoran≠

0nim博弈先手必勝,當且僅當 a_1\texta_2\text\cdots \text a_n\ne 0

nim博弈先

手必勝,

當且僅當

a1​xora2

​xor

⋯xoran

​​=

0

#include.h>

using namespace std;

int n,res,x;

int main()

if(res) cout<

<

"yes"

<

else cout<

<

"no"

<

}

現在,有乙個n

nn級台階的樓梯,每級台階上都有若干個石子,其中第i

ii級台階上有a

ia_i

ai​個石子(i≥

1)

(i≥1)

(i≥1)。

兩位玩家輪流操作,每次操作可以從任意一級台階上拿若干個石子放到下一級台階中(不能不拿)。

已經拿到地面上的石子不能再拿,最後無法進行操作的人視為失敗。

問如果兩人都採用最優策略,先手是否必勝。

分析:如果奇數台階個數異或和不為0,先手必勝。

每次將奇數台階的異或和變為0,把異或和為0的局面拋給對面。

若對面移動偶數台階的石子,下一輪先手就把偶數台階的式子移動到下一級的奇數台階,這樣奇數台階的異或和始終不變。

若對面移動奇數台階,那下一輪先手再把移動到的偶數台階部分移動到下一奇數台階,就又是開局的情況了。

#include.h>

using namespace std;

int n,x,res;

int main()

if(res) cout<

<

"yes"

<

else cout<

<

"no"

<

}

設s

ss表示乙個非負整數的集合。定義mex

(s

)mex(s)

mex(s)

為求出不屬於集合s

ss的最小非負整數的運算,即mex

(s)=

minx

∈n,x

∉s

mex(s)=\underset\left \

mex(s)

=x∈n

,x∈/

​smin​

設局面x

xx能到達的局面為y1,

y2,.

..,y

ny_1,y_2,...,y_n

y1​,y2

​,..

.,yn

​,則:

s g(

x)=m

ex()

sg(x)=mex(\left \ )

sg(x)=

mex(

)遊戲結束時,sg(

x)=0

sg(x)=0

sg(x)=

0設有m

mm個遊戲。先手必敗時:

s g(

g1

)xorsg

(g2)

xor⋯

xorsg(

gm)=

0sg(g_1)\textsg(g_2)\text\cdots\textsg(g_m)=0

sg(g1​

)xorsg

(g2​

)xor

⋯xorsg

(gm​

)=0給定n

nn堆石子以及乙個由k

kk個不同正整數構成的數字集合sss。

現在有兩位玩家輪流操作,每次操作可以從任意一堆石子中拿取石子,每次拿取的石子數量必須包含於集合s

ss,最後無法進行操作的人視為失敗。

問如果兩人都採用最優策略,先手是否必勝。

分析:對於每個石子堆,求出他的sgsg

sg值:先遍歷集合,用有向圖遞迴的方式求出sgsg

sg值。最後判斷異或和是否為0

00

#include.h>

using namespace std;

const int n=

105,m=

1e5+5;

int n,m,s[n]

,f[m]

,res,x;

int sg

(int x)

for(int i=0;

;i++)if

(!s.

count

(i))

return f[x]

=i;}

int main()

if(res) cout<

<

"yes"

<

else cout<

<

"no"

<

}

給定n

nn堆石子,兩位玩家輪流操作,每次操作可以取走其中的一堆石子,然後放入兩堆規模更小的石子(新堆規模可以為0

00,且兩個新堆的石子總數可以大於取走的那堆石子數),最後無法進行操作的人視為失敗。

問如果兩人都採用最優策略,先手是否必勝。

分析:分別求出拆分的sgsg

sg值,然後判斷異或和是否為0即可。

其中用到重要結論

s g(

i,j)

=sg(

i)

xorsg(

j)

sg(i,j)=sg(i)\textsg(j)

sg(i,j

)=sg

(i)xorsg

(j)

#include.h>

using namespace std;

const int n=

105;

int n,res,f[n]

,x;int sg

(int x)

int main()

if(res) cout<

<

"yes"

<

else cout<

<

"no"

<

}

博弈論(一) Nim遊戲

重點結論 對於乙個nim遊戲的局面 a1,a2,an 它是p position當且僅當a1 a2 an 0,其中 表示位異或 xor 運算。nim遊戲是博弈論中最經典的模型 之一?它又有著十分簡單的規則和無比優美的結論,由這個遊戲開始了解博弈論恐怕是最合適不過了。nim遊戲是組合遊戲 combina...

博弈論之Nim遊戲

二 nim遊戲的定義 三 過程例項 四 分析 3.bouton s theorem 五 例題 nim遊戲是博弈論中最經典的模型 之一 它又有著十分簡單的規則和無比優美的結論 nim遊戲是組合遊戲 combinatorial games 的一種,準確來說,屬於 impartial combinator...

Nim遊戲 簡單博弈論

原題鏈結 給定n堆石子,兩位玩家輪流操作,每次操作可以從任意一堆石子中拿走任意數量的石子 可以拿完,但不能不拿 最後無法進行操作的人視為失敗。問如果兩人都採用最優策略,先手是否必勝。輸入格式 第一行包含整數n。第二行包含n個數字,其中第 i 個數字表示第 i 堆石子的數量。輸出格式 如果先手方必勝,...