Nim博弈與Anti Nim博弈

2021-08-19 19:28:58 字數 3531 閱讀 6707

nim博弈的原題:

問題1:

今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根, 可將一堆全取走,但不可不取,最後取完者為勝,求必勝的方法。

定義:若所有火柴數異或為0,則該狀態被稱為利他態,用字母t表示;否則, 為利己態,用s表示。

注意:這篇博文是先定義s和t,再通過它們的性質推出結論。

[定理1]:對於任何乙個s態,總能從一堆火柴中取出若干個使之成為t態。

證明:若有n堆火柴,每堆火柴有a(i)根火柴數,那麼既然現在處於s態, c = a(1) xor a(2) xor … xor a(n) > 0;

把c表示成二進位制,記它的二進位制數的最高位為第p位,則必然存在乙個a(t),它二進位制的第p位也是1。

(否則,若所有的a(i)的第p位都是0,這與c的第p位就也為0矛盾)。

那麼我們把x = a(t) xor c,則得到x < a(t).這是因為既然a(t)的第p位與c的第p位同為1,那麼x的第p位變為0,而高於p的位並沒有改變。

所以x < a(t).而

a(1) xor a(2) xor … xor x xor … xor a(n)

= a(1) xor a(2) xor … xor a(t) xor c xor … xor a(n)

= a(1) xor a(2) xor… xor a(n) xor a(1) xor a(2) xor … xor a(n)

= 0這就是說從a(t)堆中取出 a(t) - x 根火柴後狀態就會從s態變為t態。證畢

[定理2]:t態,取任何一堆的若干根,都將成為s態。

證明:用反證法試試。

若c = a(1) xor a(2) xor … xor a(i) xor … xor a(n) = 0;

c' = a(1) xor a(2) xor … xor a(i') xor … xor a(n) = 0;

則有:c xor c' = a(1) xor a(2) xor … xor a(i) xor … xor a(n) xor a(1) xor a(2) xor … xor a(i')  xor … xor a(n) = a(i) xor a(i') =0

進而推出a(i) = a(i'),這與已知矛盾。所以命題得證。

[定理 3]:s態,只要方法正確,必贏。

最終勝利即由s態轉變為t態,任何乙個s態,只要把它變為t態,(由定理1,可以把它變成t態。)對方只能把t態轉變為s態(定理2)。這樣,所有s態向t態的轉變都可以有己方控制,對方只能被動地實現由t態轉變為s態。因為全零屬於t態,故s態必贏。(不能單單從對稱拿取來考慮這個問題。例如a=b xor c,然後求sg這種情況。因為證不出來。。定理1只是說存在這種情況,並沒有說對稱拿取。)

[定理4]:t態,只要對方法正確,必敗。

由定理3易得。 

反尼姆博弈

問題2:

今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根, 可將一堆全取走,但不可不取,最後取完者為負,求必勝的方法。

定義:若一堆中僅有1根火柴,則被稱為孤單堆。若大於1根,則稱為充裕堆

定義:t態中,若充裕堆的堆數大於等於2,則稱為完全利他態,用t2表示;若充裕堆的堆數等於0,則稱為部分利他態,用t0表示。

孤單堆的根數異或只會影響二進位制的最後一位,但充裕堆會影響高位(非最後一位)。乙個充裕堆,高位必有一位不為0,則所有根數異或不為0。故不會是t態。

同上s表示異或和》0,t表示異或和為0

[定理5]:s0態,即僅有奇數個孤單堆,必敗。t0態必勝。

s0表示異或和》0且無充裕堆(只有孤單堆) => 因為孤單堆只會影響二進位制的最後一位,

所以當異或和》0時說明僅有奇數個孤單堆 於是必敗(比如有3個孤單堆,先手肯定把最後乙個給拿走,先手必輸。)

同理,t0表示異或和為0且無充裕堆 => 於是一定僅有偶數個孤單堆。(後手一定把最後乙個給拿走,先手必勝。)

[定理6]:s1態,只要方法正確,必勝。

s1態表示異或和》0,且有1個充裕堆。注:不存在t1態,因為有乙個充裕堆的時候,其異或值一定不為0(充裕堆會影響高位)

有兩個操作

1.當孤單堆為奇數的時候,先手只需要將唯一的充裕堆給全拿走。後手就進入了s0態。先手必勝!

2.當孤單堆為偶數的時候,先手只需要將唯一的充裕堆拿的只剩下乙個。後手又進入裡s0態。先手必勝!

[定理7]:s2態不可轉一次變為t0態。

充裕堆數量不可能一次從2個變成1個

[定理8]:s2態可一次轉變為t2態。

由定理1可證明s態一定可以通過某種操作變成t態。

又由定理7可以得知s2態不可能變成t0態,且不存在t1態,於是只能變成t2態。

[定理9]:t2態,只能轉變為s2態或s1態。

由定理7可以得知,2個充裕堆不可能一次變成0個

又由定理二可以得知t態通過任意的變化都要變成s態

於是t2態只能變成s2態或者s1態

[定理10]:s2態,只要方法正確,必勝.

方法如下: 

1)  s2態,就把它變為t2態。(由定理8) 

2)  對方只能t2轉變成s2態或s1態(定理9)

若轉變為s2,  轉向1) 

若轉變為s1,  這己必勝。(定理6) 

[定理11]:t2態必輸。

證明同定理10

先手只能將t2變成s1或s2

1)s1態 後手勝!

2)s2態 後手將s2變成t2,先手重新選擇。

所以:必勝態:t0,s1,s2

必敗態:s0,t2

比較2題

t0(第一題做法)。哪一方控制了s1態,他即可以有辦法使自己得到最後一根**變為 

t0),

也可以使對方得到最後一根**變為s0)。 

所以,搶奪s1是制勝的關鍵! 

為此,始終把t2態讓給對方,將使對方處於被動狀態,他早晚將把狀態變為s1.

例題

hdu1907

反nim博弈原題

#includeusing namespace std;

int main()

if(ans)

else

}return 0;

}

hdu-2509

反尼姆博弈

#includeusing namespace std;

int main()

if(ans)

else

}return 0;

}

Anti Nim博弈原理與證明

anti nim博弈是nim博弈的變形,它的定義是 給定 n 堆物品,第 i 堆物品有 a i 個,兩人輪流取,每次可以任選一堆取走任意多個物品,可以取光但不能不取,最後把物品全部取完者失敗 判斷先手是否有必勝策略 先手必勝當且僅當 每堆的物品數都為 1 且nim和為 0 有些堆的物品數大於 1 且...

博弈論 Nim博弈 反Nim博弈 SG函式

nim遊戲 hdu1846 若各堆石子異或和為不為零,則先手勝 後手當且僅當異或和為零時取勝 此題問要想先手取勝第一步的取法,考慮到上述引理,只需遍歷一遍石子找到異或和的最高位匹配的個數。int a 105 int main return0 view code hdu 1848 在上題的基礎上取法只...

博弈論 Nim博弈

1.nim博弈的起源很早,至於歷史我們就不再說了,直接說它的使用場景。1 依舊是兩個人博弈,但是物品時n堆,每一堆有ai個。2 每個人可以挑選一堆取走若干個,但是不能不取。3 最先取完所有物品的人獲勝。4 結論 所以堆的物品的數量異或起來是0,先手必敗。2.乙個nim博弈的例項 nim博弈。乍一看這...