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博弈。乍一看這...