Nim 遊戲 SG 函式 遊戲的和

2022-08-19 07:54:15 字數 3510 閱讀 1491

nim遊戲是組合遊戲(combinatorial games)的一種,準確來說,屬於「impartial combinatorial games」(以下簡稱icg)。滿足以下條件的遊戲是icg(可能不太嚴謹):1、有兩名選手;2、兩名選手交替對遊戲進行移動(move),每次一步,選手可以在(一般而言)有限的合法移動集合中任選一種進行移動;3、對於遊戲的任何一種可能的局面,合法的移動集合只取決於這個局面本身,不取決於輪到哪名選手操作、以前的任何操作、骰子的點數或者其它什麼因素; 4、如果輪到某名選手移動,且這個局面的合法的移動集合為空(也就是說此時無法進行移動),則這名選手負。根據這個定義,很多日常的遊戲並非icg。例如象棋就不滿足條件3,因為紅方只能移動紅子,黑方只能移動黑子,合法的移動集合取決於輪到哪名選手操作。 

通常的nim遊戲的定義是這樣的:有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

定義p-position和n-position,其中p代表previous,n代表next。直觀的說,上一次move的人有必勝策略的局面是p-position,也就是「後手可保證必勝」或者「先手必敗」,現在輪到move的人有必勝策略的局面是n-position,也就是「先手可保證必勝」。更嚴謹的定義是:1.無法進行任何移動的局面(也就是terminal position)是p-position;2.可以移動到p-position的局面是n-position;3.所有移動都導致n-position的局面是p-position。 

所以對於當前的局面,遞迴計算它的所有子局面的性質,如果存在某個子局面是p-position,那麼向這個子局面的移動就是必勝策略。 

對於某個nim遊戲的局面(a1,a2,…,an)來說,要想判斷它的性質以及找出必勝策略,需要計算o(a1*a2*…*an)個局面的性質。

對於乙個nim遊戲的局面(a1,a2,…,an),它是p-position當且僅當a1^a2^…^an=0,其中^表示異或(xor)運算。

根據定義,證明一種判斷position的性質的方法的正確性,只需證明三個命題:

1、這個判斷將所有terminal position判為p-position;

2、根據這個判斷被判為n-position的局面一定可以移動到某個p-position;

3、根據這個判斷被判為p-position的局面無法移動到某個p-position。

第乙個命題顯然,terminal position只有乙個,就是全0,異或仍然是0。

第二個命題,對於某個局面(a1,a2,…,an),若a1^a2^…^an!=0,一定存在某個合法的移動,將ai改變成ai』後滿足a1^a2^…^ai』^…^an=0。不妨設a1^a2^…^an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時ai^k< ai一定成立。則我們可以將ai改變成ai』=ai^k,此時a1^a2^…^ai』^…^an=a1^a2^…^an^k=0。

第三個命題,對於某個局面(a1,a2,…,an),若a1^a2^…^an=0,一定不存在某個合法的移動,將ai改變成ai』後滿足a1^a2^…^ai』^…^an=0。因為異或運算滿足消去率,由a1^a2^…^an=a1^a2^…^ai』^…^an可以得到ai=ai』。所以將ai改變成ai』不是乙個合法的移動。證畢。

根據這個定理,我們可以在o(n)的時間內判斷乙個nim的局面的性質,且如果它是n-position,也可以在o(n)的時間內找到所有的必勝策略。nim問題就這樣基本上完美的解決了。

給定乙個有向無環圖和乙個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移動者判負。事實上,這個遊戲可以認為是所有impartial combinatorial games的抽象模型。也就是說,任何乙個icg都可以通過把每個局面看成乙個頂點,對每個局面和它的子局面連一條有向邊來抽象成這個「有向圖遊戲」。下面我們就在有向無環圖的頂點上定義sprague-garundy函式。

首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague-garundy函式g如下:g(x)=mex。

來看一下sg函式的性質。首先,所有的terminal position所對應的頂點,也就是沒有出邊的頂點,其sg值為0,因為它的後繼集合是空集。然後對於乙個g(x)=0的頂點x,它的所有後繼y都滿足g(y)!=0。對於乙個g(x)!=0的頂點,必定存在乙個後繼y滿足g(y)=0。

以上這三句話表明,頂點x所代表的postion是p-position當且僅當g(x)=0(跟p-positioin/n-position的定義的那三句話是完全對應的)。我們通過計算有向無環圖的每個頂點的sg值,就可以對每種局面找到必勝策略了。但sg函式的用途遠沒有這樣簡單。如果將有向圖遊戲變複雜一點,比如說,有向圖上並不是只有一枚棋子,而是有n枚棋子,每次可以任選一顆進行移動,這時,怎樣找到必勝策略呢?

讓我們再來考慮一下頂點的sg值的意義。當g(x)=k時,表明對於任意乙個0<=i< k,都存在x的乙個後繼y滿足g(y)=i。也就是說,當某枚棋子的sg值是k時,我們可以把它變成0、變成1、…、變成k-1,但絕對不能保持k不變。不知道你能不能根據這個聯想到nim遊戲,nim遊戲的規則就是:每次選擇一堆數量為k的石子,可以把它變成0、變成1、„„、變成k-1,但絕對不能保持k不變。這表明,如果將n枚棋子所在的頂點的sg值看作n堆相應數量的石子,那麼這個nim遊戲的每個必勝策略都對應於原來這n枚棋子的必勝策略! 

剛才,我們為了使問題看上去更容易一些,認為n枚棋子是在乙個有向圖上移動。但如果不是在乙個有向圖上,而是每個棋子在乙個有向圖上,每次可以任選乙個棋子(也就是任選乙個有向圖)進行移動,這樣也不會給結論帶來任何變化。

所以我們可以定義有向圖遊戲的和(sum of graph games):設g1、g2、…、gn是n個有向圖遊戲,定義遊戲g是g1、g2、……、gn的和(sum),遊戲g的移動規則是:任選乙個子遊戲gi並移動上面的棋子。

sprague-grundy theorem就是:g(g)=g(g1)^g(g2)^…^g(gn)。也就是說,遊戲的和的sg函式值是它的所有子遊戲的sg函式值的異或。

再考慮在本文一開頭的一句話:任何乙個icg都可以抽象成乙個有向圖遊戲。所以「sg函式」和「遊戲的和」的概念就不是侷限於有向圖遊戲。我們給每個icg的每個position定義sg值,也可以定義n個icg的和。所以說當我們面對由n個遊戲組合成的乙個遊戲時,只需對於每個遊戲找出求它的每個局面的sg值的方法,就可以把這些sg值全部看成nim的石子堆,然後依照找nim的必勝策略的方法來找這個遊戲的必勝策略了!

1

intsg[n];

2bool

vis[n];

3void sg_solve(int *s,int t,int n) //

n求解範圍 s陣列是可以每次取的值,t是s的長度。 4

18 }

博弈之 nim 遊戲和 sg 函式

nim遊戲和SG函式

1.無法進行任何移動的局面 terminal position 是p position.先手必敗 2.可以移動到p position的是n position.先手必勝 3.所有可行的移動都導致n position的是p position.先手必敗 mex minimal excludant 運算 對...

組合遊戲(Nim遊戲) SG函式

sg為0的點 必敗點 能到達的肯定都是sg不為0的點 必勝點 sg不為0的點 必勝點 一定能通過某種方式到達sg為0的點 必敗點 組合遊戲典型例題 給定n堆石子以及乙個由k個不同正整數構成的數字集合s。現在有兩位玩家輪流操作,每次操作可以從任意一堆石子中拿取石子,每次拿取的石子數量必須包含於集合s,...

博弈論 Nim遊戲與SG函式

普通nim遊戲 有若干堆石子,兩人輪流從中取石子,取走最後乙個石子的人為勝利者 我們判斷先手必勝還是先手必敗就要判斷先手面對的局面是必勝態還是必敗態 並且普通nim遊戲滿足以下性質 1.無法移動的狀態是必敗態 2.可以移動到必敗態的局面一定是非必敗態 3.在必敗態做所有操作的結果都是非必敗態 這些性...