SG函數的計算方法:
一個局面的SG為mex{后繼局面的SG}
mex運算為集合中沒出現的最小的自然數
幾個局面的和的SG為單個的SG亦或
SG不為0時先手必勝,SG為0時后手必勝
1.Nim Game
最為經典
n堆石子,每次可以從一堆里面取任意個石子
對於一堆石子,SG函數就是石子數
整個游戲的SG函數是每一堆石子的SG函數的亦或和
必勝:SG不為0
必敗:SG為0
2.Bash Game
每次最多取m個石子,其他同Nim
一堆石子的SG函數為石子數mod(m+1)
整個游戲的SG函數是每一堆石子的SG函數的亦或和
必勝:SG不為0
必敗:SG為0
3.Nimk Game
每次最多可以同時從k堆石子進行操作,這k堆可以取不同數量的石子
一堆石子的SG函數為石子數
對每一個二進制位單獨算,求SG函數每一個二進制位1的個數mod(k+1),如果都為0,則必敗,否則必勝
證明:
對於必敗態不管怎么走都只能走到必勝態
對於變化的SG的最高位,你至少變化為1,最多變化為k,所以這一位1的個數不可能mod(k+1)還是為0
對於必勝態我們肯定可以找到一種方法走到必敗態
我們從高位往低位做,記s為這一位可以隨意填值的數字個數(如果把某一位從1變成0,那么更低位就能隨便取值了)
假設我們現在做到第k位,記n為除了能隨便取值的s位以外這一位1的個數mod(k+1)
如果n+s<=k,那么很簡單,我們取出n個第k位為1的讓這些數字的第k位變成0,那s個數字這一位也變成0,然后s+=n
如果n+s>k,即n+s>=k+1,那么s>=k+1-n,我們在s中間取k+1-n個變為1,其他變為0就可以滿足條件了
4.Anti-Nim Game
不能取石子的一方獲勝
必勝:SG不為0且至少有一堆石子數大於0,SG為0且每一堆石子數都為1
必敗:其余為必敗
5.Staircase Nim
階梯博弈
每次可以從一個階梯上拿掉任意數量石子放到下一層階梯,不能操作的為輸
SG函數為奇數階梯上的石子的亦或和
如果移動偶數層的石子到奇數層,對手一定可以繼續移動這些石子到偶數層,使得其SG不變
6.Wythoff Game
有兩堆石子,每次可以從一堆或者兩堆里拿走一樣數目的石子,不能取的為輸
必敗態為(1,2)(3,5)(4,7)(6,10)...
差為1,2,3,4.....每一對數的第一個數為前面沒出現的最小的正整數
7.Take & Break
每次可以把一堆石子分成兩堆甚至多堆不為0的石子,不能操作的為輸
暴力計算SG
8.樹上刪邊游戲
給定根節點,每次可以刪掉一條邊,不與根節點相連的部分刪除
葉子節點SG為0,其他節點的SG函數為子樹SG+1的亦或和
證明:
將子樹SG+1看做石子數(我們可以定義沒有節點的圖的SG為-1),然后就變成了取石子游戲
9.無向圖刪邊
規則同樹上刪邊游戲
結論:把奇環縮成一個點加一條新邊,把偶環縮成一個點,不影響SG,然后套用樹上刪邊游戲
10.翻硬幣游戲
n枚硬幣排成一排,有的正面朝上,有的反面朝上。
游戲者根據某些約束翻硬幣(如:每次只能翻一或兩枚,或者每次只能翻連續的幾枚),但他所翻動的硬幣中,最右邊的必須是從正面翻到反面。
誰不能翻誰輸。
需要先開動腦筋把游戲轉化為其他的取石子游戲之類的,然后用如下定理解決:
局面的 SG 值等於局面中每個正面朝上的棋子單一存在時的 SG 值的異或和。
證明的基本套路:
必勝局面存在一個操作到達必敗局面,必敗局面無論怎么操作都會到必勝局面