1. 程式人生 > >博弈---尼姆博奕(Nimm Game)(重點)

博弈---尼姆博奕(Nimm Game)(重點)

取火柴的遊戲
題目1:今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根, 
可將一堆全取走,但不可不取,最後取完者為勝,求必勝的方法。 
題目2:今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根, 
可將一堆全取走,但不可不取,最後取完者為負,求必勝的方法。
嘿嘿,這個遊戲我早就見識過了。小時候用珠算玩這個遊戲:第一檔撥一個,第二檔撥兩個,依次直到第五檔撥五個。然後兩個人就輪流再把棋子撥下來,誰要是最後一個撥誰就贏。有一次暑假看見兩個小孩子在玩這個遊戲,我就在想有沒有一個定論呢。下面就來試著證明一下吧
先解決第一個問題吧。
定義:若所有火柴數異或為0,則該狀態被稱為利他態,用字母T表示;否則, 
為利己態,用S表示。
[定理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 c 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 c 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態。故S態必贏。
[定理4]:T態,只要對方法正確,必敗。 
  由定理3易得。 
接著來解決第二個問題。
定義:若一堆中僅有1根火柴,則被稱為孤單堆。若大於1根,則稱為充裕堆。
定義:T態中,若充裕堆的堆數大於等於2,則稱為完全利他態,用T2表示;若充裕堆的堆數等於0,則稱為部分利他態,用T0表示。
 
孤單堆的根數異或只會影響二進位制的最後一位,但充裕堆會影響高位(非最後一位)。一個充裕堆,高位必有一位不為0,則所有根數異或不為0。故不會是T態。
[定理5]:S0態,即僅有奇數個孤單堆,必敗。T0態必勝。 
證明:
S0態,其實就是每次只能取一根。每次第奇數根都由己取,第偶數根都由對 
方取,所以最後一根必己取。敗。同理,  T0態必勝#
[定理6]:S1態,只要方法正確,必勝。 
證明:
若此時孤單堆堆數為奇數,把充裕堆取完;否則,取成一根。這樣,就變成奇數個孤單堆,由對方取。由定理5,對方必輸。己必勝。  # 
[定理7]:S2態不可轉一次變為T0態。 
證明:
充裕堆數不可能一次由2變為0。得證。  # 

[定理8]:S2態可一次轉變為T2態。 
證明:
由定理1,S態可轉變為T態,態可一次轉變為T態,又由定理6,S2態不可轉一次變為T0態,所以轉變的T態為T2態。  # 
[定理9]:T2態,只能轉變為S2態或S1態。 
證明:
由定理2,T態必然變為S態。由於充裕堆數不可能一次由2變為0,所以此時的S態不可能為S0態。命題得證。 
[定理10]:S2態,只要方法正確,必勝. 
證明:
方法如下: 
      1)  S2態,就把它變為T2態。(由定理8) 
      2)  對方只能T2轉變成S2態或S1態(定理9)
    若轉變為S2,  轉向1) 
    若轉變為S1,  這己必勝。(定理5) 
[定理11]:T2態必輸。 
證明:同10。 
綜上所述,必輸態有:  T2,S0 
          必勝態:    S2,S1,T0. 
兩題比較: 
第一題的全過程其實如下: 
S2->T2->S2->T2->  ……  ->T2->S1->T0->S0->T0->……->S0->T0(全0) 
第二題的全過程其實如下: 
S2->T2->S2->T2->  ……  ->T2->S1->S0->T0->S0->……->S0->T0(全0) 
下劃線表示勝利一方的取法。  是否發現了他們的驚人相似之處。 
我們不難發現(見加黑部分),S1態可以轉變為S0態(第二題做法),也可以轉變為 
T0(第一題做法)。哪一方控制了S1態,他即可以有辦法使自己得到最後一根(轉變為 
T0),也可以使對方得到最後一根(轉變為S0)。 
  所以,搶奪S1是制勝的關鍵! 
  為此,始終把T2態讓給對方,將使對方處於被動狀態,他早晚將把狀態變為S1.

相關推薦

博弈---Nimm Game重點

取火柴的遊戲 題目1:今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根,  可將一堆全取走,但不可不取,最後取完者為勝,求必勝的方法。  題目2:今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根,  可將一堆全取走,但不可不取,最後取完者為負,求必勝的方法。 嘿嘿,這個遊戲我早就

三大經典博弈 + 巴仕博弈 + 威佐夫博弈 +SG函式

第一,尼姆博奕(Nimm Game) 一,特例分析 有三堆各若干個物品,兩個人輪流從某一堆取任意多的 物品,規定每次至少取一個,多者不限,最後取光者得勝。 我們用(a,b,c)表示某種局勢,首先(0,

博弈Nimm Game

尼姆博弈(Nimm Game) 尼姆博弈指的是這樣一個博弈遊戲:有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。 結論就是:把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。

博弈論知識點總結巴什 威佐夫博弈 博弈 SG()函式介紹

總結 真心感謝博主,終於知道為什麼尼姆博弈用異或來解決。 SG函式模板: void init()//根據題目要求進行修改 { a[0]=1; for(int i=1;i<=32;i

學以致用——Java原始碼——拋雙骰兒遊戲改進版Craps Game Modification with wagering

  package exercises.ch6Methods; import java.security.SecureRandom; import java.util.Scanner; /** * * 6.33 (Craps Game Modification) Modi

面試----集合HashMap----怎麼答每一行都畫重點

先說說HashMap 1:首先HashMap 是一個散列表,它儲存的內容是鍵值對(key-value)對映,HashMap中的對映不是有序的。HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面。不是執行緒安全的。HashM

堅持努力奮鬥學習有終身受益的重點

今天是2016年7餘28日,晴天 知道了如何檢視位元組:sizeof(int);printf("%d,"sizeof(int));要記住char,int的位元組,,型別轉換小的要給大的。它們的位元組分別為char 1,short 2,int 4,float 4,double

博弈論巴什,威佐夫博弈博弈,斐波那契博弈

一.  巴什博奕(Bash Game):   A和B一塊報數,每人每次報最少1個,最多報4個,看誰先報到30。這應該是最古老的關於巴什博奕的遊戲了吧。 其實如果知道原理,這遊戲一點運氣成分都沒有,只和先手後手有關,比如第一次報數,A報k個數,那麼B報5-k個數,那麼B報數之

ICG博弈_博弈Nim Game及證明

這是最後一篇ICG博弈,尼姆博弈,對比前面的巴什博弈和威佐夫博弈,尼姆博弈的玩法更加自由化,因此想贏的過程也更加複雜。   如果沒有了解過巴什博弈和威佐夫博弈的,建議先看上兩篇 :巴什博弈及證明   威佐夫博弈及證明 尼姆博弈(Nimm Game)

博弈——混合HDU 4388 Stone Game II

1.題目含義:   一共有n堆石子,每堆石子個數用x表示。現在你可以選擇一堆移除某些石子,但要剩餘k個石子,確保k在[1,n-1]這個區間內。  移除石子後,還要加入一些石子,加入石子的個數為:k^x,當然你也可以使用技能使得加入的石子個數變為(2k)^x。不過每個人

理論: 博弈2: 巴什Bash Game

巴什博奕基礎情形 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個。最後取光者得勝。 如果n = m + 1; 我們假設第一個人拿走了k個, 還剩下 m + 1 - k。 因為1<=(m + 1 - k)<=

博弈(三) 博弈(Nimm Game)

尼姆博弈(Nimm Game) 有3堆任意多的物品(x, y, z)。兩個人輪流拿,每次只能從一堆中拿,至少拿一個,至多不限。拿到最後者勝利。 結論: 必敗點為 x^y^z = 0。(^為異或) 證明: 如果當前局勢為(0,0,0)。先手肯定輸。其中0

“浪潮杯”第九屆山東省ACM大學生程式設計競賽重現賽 G game 博弈

題目描述 Alice and Bob are playing a stone game. There are n piles of stones. In each turn, a player can remove some stones from a pile (th

Being a Good Boy in Spring Festival杭電1850博弈

cor gree 強烈 方案 con tracking output script 主動 Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limi

POJ2234 Matches Game 博弈 博弈論

none dbf hide 一個 lan while splay ont href http://poj.org/problem?id=2234 尼姆博弈(Nimm‘s Game) 指的是這樣一個博弈遊戲:有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能

【USTC 1213】取石子遊戲博弈

std col 遊戲 script pro 取石子 div ++ pre Description 在組合博弈論中,Nim遊戲是一個非常經典的問題,Nim遊戲可描述如下:有n堆石子,每堆石子數分別為a1, a2, …, an (ai≥0)。現有兩人輪流從這n堆中取石子,每

題解報告:hdu 1850 Being a Good Boy in Spring Festival博弈

轉化 主動 輸入 content hdu () scrip tput inpu 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Problem Description 一年在外 父母時刻牽掛春節回家 你能做幾天好孩子嗎

Nim遊戲博弈

這裡是尼姆博弈的模板,前面的博弈問題的部落格裡也有,這裡單列出來。 有N堆石子。A B兩個人輪流拿,A先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出N及每堆石子的數量,問最後誰能贏得比賽。

HDU 5973 Aninteresting game 威佐夫Wythoff Game

== targe scanner rgs void 威佐夫 pre static div HDU 5973:http://acm.hdu.edu.cn/showproblem.php?pid=5975 題意:   有兩堆石子,每次可以從一堆石子中取任意個,或者從兩堆石子

巴什Bash Game

巴什博奕(Bash Game) 類似題目連結(杭電4764):http://acm.hdu.edu.cn/showproblem.php?pid=4764 程式碼如下: #include<iostream> #include<cstring> using na