程式設計之美NIM(2)遊戲分析擴充套件問題

2021-10-02 15:56:52 字數 1477 閱讀 3920

問題:

有n塊石頭和兩個玩家a和b,玩家a先將石頭隨機分成若干堆,然後按照baba...的順序不斷輪流取石頭,能將剩下的石頭一次取光的玩家獲勝,每次取石頭時,每個玩家只能從若干堆石頭中任選一堆,取這一堆石頭中任意數目(大於0)個石頭。

請問:玩家a要怎樣分配和取石頭才能保證自己有把握取勝?

如果石頭的個數n為偶數,a只要將其分為相同的兩份,就一定能取勝。

初始:xor(m1, m1) == 0

玩家b:xor(m1, m2) != 0  (其中一堆的個數減少到m2)

玩家a:xor(m2, m2) == 0  (玩家a將另一堆的個數也減少到m2)

結果:xor(m2, m2) == 0  (直到結束狀態(0, 0))

如果石頭的個數n為奇數,b有必勝的方法。

初始:xor(m1, m2, ... , mn) != 0

玩家b:xor(m1, ... , mi', ... , mn) == 0 (其中一堆mi的個數減少到mi')

玩家a:xor(m1, ... , mj', ... , mn) != 0

玩家b:xor(m1, ... , mi', ... , mn) == 0 (其中一堆mi的個數減少到mi')

結果:xor(m1, ... , mj' , ... , mn) == 0 (直到結束)

擴充套件問題1 如果規定相反,取光所有石頭的人輸,又該如何控制局面?

如果石頭的個數n為奇數,則只需將石頭分為n堆,每堆的個數為1個,則按照baba的順序取石頭,顯然b必然是最後乙個取石頭,所以b必輸。

如果石頭的個數n為偶數,假設n=2,則不管a如何初始化石頭(1,1)(2)則b只需取走乙個石頭,a必輸。

假設n=4,a初始化石頭為(2,2),假若b取走其中一堆的一塊石頭變為(1,2),則玩家a只需把個數為2的那堆石頭取走,則b就輸了,

a初始化石頭為(2,2),假若b取走一堆石頭的2塊石頭變為(0,2),則玩家a只需再取走一塊石頭,則b就輸了。

所以當n=4時只需將石頭初始化(2,2)則a必有辦法取勝。

假設n為》=6的偶數,則只需要將其分為相等的兩塊(n/2,n/2),按照baba的順序取石頭,

(1)則若b從一堆中取出石頭使石頭變為(m,n/2),若m>=2,則a立即從另一堆石頭取相等的石頭使剩餘的石頭變為(m,m),這樣baba的取石頭會在某次a取石頭之後使石頭變為(2,2)的局面,則a贏b輸。

(2)若b從一堆中取出石頭使石頭變為(m,n/2)若m=1,則a只需取完另一堆的n/2塊石頭即可,這時b輸a贏,

(3)若b從一堆中取出石頭後石頭變為(m,n/2)若m=0,則a只需要從另一堆中取出n/2-1塊石頭即可,這時b輸a贏。

以上(1)中若b第一次取使石頭的個數變為(m,2/n)其中m>=2,則a取後變成(m,m),則b再取變為(m',m),若m'<2,則處理方式與以上的(2)和(3)類似。

總之若規定最後取完石頭的人輸,石頭的個數為n,若n不等於2,則a總有辦法可以獲勝。

NIM 2 拈 遊戲分析

程式設計之美 第1.12節 nim 2 拈 遊戲分析 如果石頭總數n是偶數,則後動手的人能贏 如果石頭數時奇數,則先動手的人贏,先動手的人只要保證每次取完石頭以後,每堆石頭的總數異或後得1即可。下面程式給出當n是奇數時,應該如何選取,函式返回值pair中first表示取第i堆,i從0開始,secon...

程式設計之美 NIM遊戲與NIM擴充套件遊戲的討論及解

程式設計之美上面有個nim的遊戲,規則如下 有n堆石頭,兩個人輪流從中取,一次只能在一堆中取,至少取乙個,最多把這一堆取完,取得最後乙個石頭的人勝利,問誰有必勝策略。解 設這n堆石頭的個數分別是x1,x2 xn,設f x x1 x2 x3 xn。如果f x 0則後取的獲勝,否則,先取的獲勝。證明 如...

程式設計之美 1 12 nim 2

參考 有若干堆石頭,a,b分布依次取,一次只能選擇一堆,從這堆中選擇大於0的石頭,問 1,如果最後取光石頭的人獲勝,a在什麼情況下獲勝?2,如果最後取光石頭的人失敗,a在什麼情況下獲勝?1.在規則1下,先手獲勝的情況,在規則2下先手同樣獲勝 2.規則1和規則2的取法不一樣。設當石頭出現 1,1,1,...