nim遊戲的必勝策略

2021-06-18 04:20:21 字數 1338 閱讀 6576

假設有n堆石子,每堆石子的個數分別如下

a1, a2, a3, ... an

定義nim-sum為a1^a2^a3...an 

可以證明

1. 若a1^a2^a3...an != 0

則經過一次合法的移動之後必定可變成

a1^a2....an = 0

此時留下的局面為必勝。

2. 若a1^a2^a3...an = 0

則經過一次合法的移動,局面必定成為

a1^a2^a3...an != 0

3. 只要在某回合中留下a1,a2...an

使a1^a2^a3...an = 0,此時局面必勝

證明1:假設a1^a2^a3...an != 0 = k

則檢視k的最高位,假設是在第x位上,則此位上有a1x^a2x^a3x....anx = 1 (a1x表示a1寫成二進位制,取a1的第x位)

必然可以尋找到乙個ai(至少乙個),其aix = 1

此時有ai^k < ai

改變ai這堆石子使其成為ai^k

列出式子

a1^a2^a3..^ai^...an = k

則有a1^a2^a3..^(ai^k)^...an = a1^a2^a3..^ai^...an^k = (a1^a2^a3..^ai^...an)^k = k^k = 0  即得證

證明2:使用反證法,

假設移動了ai堆石頭使其成為ai'

有a1^a2^a3..ai..an = 0

即(a1^a2...a(i-1)^a(i+1)...an)^ai = 0 可得

等式 a1^a2...a(i-1)^a(i+1)...an = ai

假設a1^a2^a3...ai'....an = 0

根據前面得出的等式a1^a2...a(i-1)^a(i+1)...an = ai

即得 ai^ai' = 0

可推出ai = ai'

此等式必然不成立,原式得證

證明3:假設遊戲開始,p1 p2兩名玩家,初始nim-sum != 0,使用必勝策略,p1始終能得到nim-sum != 0 的局面,而遊戲過程石頭始終在減少,檢視最終局面:只有一行,此行可能有若干個石頭,而遊戲進行到最後必然會得出這個局面,這個局面是乙個nim-sum != 0的局面,p1肯定能夠得到這個局面,所以遊戲必勝。

這是我用pygame寫的nim遊戲,實現的比較簡單。

Chomp遊戲(必勝策略分析)

遊戲簡介 chomp是乙個雙人遊戲,有m x n塊曲奇餅排成乙個矩形格狀,稱作棋盤。兩個玩家輪流自選一塊還剩下的曲奇餅,而且還要把它右邊和下邊所有的曲奇餅都取走 如果存在 先吃到左上角 1,1 那塊曲奇餅的玩家為失敗 如圖所示 紅方選擇 3,3 藍方選擇 1,4 紅方選擇 1,2 藍方選擇 2,1 ...

POJ 2975 NIM博弈的必勝策略方案數

題意 求解nim博弈先手必勝的方法數。解題思路 在必勝態時,先手要做的就是拿走某堆石頭中的m個,使得xor變成0。將必敗態轉移給後手,題目就是就是問有多種使得xor變成0的方法數?ki m xor ki 後面的xor ki代表所有的異或值以後上ki,即等價於除了ki這堆,其他堆的異或和。ki m x...

SG函式求解 NIM遊戲先手必勝必敗問題

nim遊戲 兩人玩家,給定狀態之間轉移規則,每個人輪流移動,最終得出勝負。設p為必敗點,n為必勝點 精髓 能到達必敗點的所有點都為必勝點,一般解題都是先找到乙個必敗點,然後由此點推必勝點 若題目中只討論一堆物品 然後讓判斷先手必勝還是必敗,一般就用乙個陣列sg n 打表,其中n是該物品的數量,通過遞...