博弈之Nim遊戲

2021-07-04 15:52:22 字數 1398 閱讀 8408

nim遊戲規則:

兩個人甲和乙的取石子遊戲,共有n堆不同的石子,編號1..n,第i堆中有a[i]個石子。

每一次行動,甲和乙可以選擇從一堆石子中取出任意數量的石子。至少取1個,至多取完。

兩人輪流行動,取走最後乙個石子的人獲得勝利(當某人不能取時失敗)。

問,兩人均取最優策略,誰會勝利??

介紹一下博弈中兩個概念:

p-position:當前局面為先手必敗局面。

n-position:當前局面為先手必勝局面。

nim遊戲的乙個神奇的結論:

對於乙個局面,當且僅當a[1]xor a[2]xor ... xor a[n]=0時,這個局面為p局面

下面貼一下hihocoder的證明

對於這個結論的證明如下:

1. 全0狀態為p局面,即a[i]=0,則a[1] xor a[2] xor ... xor a[n] = 0。

2. 從任意乙個a[1] xor a[2] xor ... xor a[n] = k != 0的狀態可以移動到a[1] xor a[2] xor ... xor a[n] = 0的狀態。由於xor計算的特殊性,我們知道一定有乙個a[i]最高位(我覺得這裡不該是a[i]的最高位,而應為a[i]的k最高位是1,詳細看證明

)與k最高位的1是相同的,那麼必然有a[i] xor k < a[i]的,所以我們可以通過改變a[i]的值為a[i]',使得a[1] xor a[2] xor ... xor a[i]' xor ... xor a[n] = 0。

3. 對於任意乙個局面,若a[1] xor a[2] xor ... xor a[n] = 0,則不存在任何乙個移動可以使得新的局面a[1] xor a[2] xor ... xor a[n] = 0。由於xor計算的特殊性,我們可以知道,一定是存在偶數個1時該位置的1才會被消除。若只改變乙個a[i],無論如何都會使得1的數量發生變化,從而導致a[1] xor a[2] xor ... xor a[n] != 0。

由於第一三點比較容易理解,下面來簡單證明一下第二點

假設k的最高位的1是在第j位,那麼a陣列中的數的所有j位異或起來得到1,那麼就至少存在乙個a[i],使得a[i]的j位是1。

那麼a[i]xor ka[1]xor a[2]xor ... xor a[n]=0,拿掉的部分就是a[i]-a[i]xor k,至於為啥是拿掉這麼多,簡單解釋一下。

先說明一下,若a xor b=c,那麼a xor c=b,b xor c=a(簡單推理一下就知道了)

然後我們令x表示所有a陣列中除a[i]之外的異或和,那麼x xor a[i]=k,且有a[i] xor k=x

那麼x xor (a[i] xor k)=x xor x=0,所以我們拿掉之後剩餘a[i] xor k(注意這個數字是比a[i]小的,這個很關鍵)個石子就行了。

證畢。

博弈 Nim遊戲

nim遊戲是博弈論中最經典的模型,它又有著十分簡單的規則和無比優美的結論。nim遊戲是組合遊戲 combinatorial games 的一種,準確來說,屬於 impartial combinatorial games 以下簡稱icg 滿足以下條件的遊戲是icg 可能不太嚴謹 1 有兩名選手 2 兩...

NIM遊戲 博弈

1.尼姆博弈 n堆石子,每堆的數量a1,a2,a3.an,一方取完後石子個數為0則該方獲勝,問先手是否必勝 if ans a1 a2 a3 an 0 先手必勝 else 先手必輸 延伸1 在此問基礎上新增乙個集合,集合內的數字是每次操作可取的石子個數,每次從一堆中取,最後無法取者判輸 對每堆石子算得...

博弈 Nim遊戲

1069 nim遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰...