淺談算法——博弈論


網上的博弈博客和論文有很多,但是有些沒有詳細的證明,僅僅是給出了結論。今天作者將一些常見的博弈論模板集中起來,給大家介紹一下博弈論中一些單一游戲的決策和常見的Nim模板與證明。

注:下列游戲都建立在雙方都有最優策略的情況下,若未加以說明,則每人每次至少取一個石子。

例1:取石子游戲之一

有兩個游戲者:\(A\)\(B\),有\(n\)顆石子。

約定:兩人輪流取走石子,每次可取\(1,2\)\(3\)顆。\(A\)先取,取走最后一顆石子的人獲勝。

問題:\(A\)有沒有必勝的策略?

分析:這是小學必備奧數題之一,我們可以很容易的知道,當\(n\)\(0,4,8,12……\)時,\(A\)必定會輸,因為不論\(A\)取多少,\(B\)只要和\(A\)共同取走\(4\)即可;當\(n\)不為\(0,4,8,12……\)時,\(A\)只需要將\(n\)取成\(4\)的倍數,這樣就變成了\(B\)先取,\(B\)一定會輸,所以\(A\)一定會贏。

經過我們的分析發現,對這個游戲而言,\(0,4,8,12……\)這些狀態是對於先手的必敗狀態,而其他狀態是對於先手的必勝狀態

如果我們推廣一下,每次不一定取\(1,2,3\)顆,而是取\(1\sim m\)顆,那么我們就可以得到,如果\(n\%(m+1)=0\),即為先手必敗狀態,否則為先手必勝狀態。而這個游戲就是著名的巴什博弈(Bash Game)

下面,我們現在介紹一下有關博弈的一些名詞和概念

1、平等組合游戲

  • 兩人游戲。
  • 兩人輪流走步。
  • 有一個狀態集,而且通常是有限的。
  • 有一個終止狀態,到達終止狀態后游戲結束。
  • 游戲可以在有限的步數內結束。
  • 規定好了哪些狀態轉移是合法的。
  • 所有規定對於兩人是一樣的。

因此我們的例1提到的游戲即為一個平等組合游戲,但是我們生活中常見的棋類游戲,如象棋、圍棋等,均不屬於平等組合游戲,因為雙方可以移動的棋子不同,不滿足最后一個條件;而我們后續提到的游戲,以及博弈中的其他游戲,基本屬於平等組合游戲

2、N狀態(必勝狀態),P狀態(必敗狀態)

像例1的分析一樣,\(0,4,8,12……\)等狀態就是對於先手的P狀態(必敗狀態),其他的則是對於先手的N狀態(必勝狀態)。

那么我們定義兩個狀態之間的轉換:

  • 所有的終止狀態都為P狀態
  • 對於任意的N狀態,存在至少一條路徑可以轉移到P狀態
  • 對於任意的P狀態,只能轉移到N狀態

證明過於簡單,這里不再贅述,我們只需要明白一點,每個人都會選擇最策略即可。

當然這里所說的都是最后走步的人獲勝的游戲,至於那些走到最后失敗的游戲,我們在最后做了一個簡單的講解(Anti Nim)。

例2:取石子游戲之二

將例1的游戲擴展一下,我們定義一個集合\(S=\{{p_{1},p_{2},...,p_{k}}\}(k \in Z^*)\)\(A,B\)在游戲的時候取走的石子數必須是集合里的數,其他條件不變。

那么,\(A\)還有必勝策略嗎?

有沒有必勝策略,我們關鍵是要找到哪些狀態是P狀態,哪些狀態是N狀態,不過,本題沒有例1那么容易判斷,因此我們需要引入一個新東西——SG函數,它的定義如下:

\[f(v)=mex\{f(u)|u\in child[v]\} \]

其中,mex(minimal excludant)是定義在整數集合上的操作。它的自變量是任意整數集合,函數值是不屬於該集合的最小自然數。

\[mex(A)=min\{k|k \in \complement_{N}A\} \]

那么,終止狀態的SG值顯然為\(0\),並且SG值為\(0\)的狀態就是P狀態,SG值不為\(0\)的狀態就是N狀態。
證明則非常顯然,SG值為\(0\)的狀態,說明它的所有后繼狀態都不為\(0\),也就是它只能轉移到非\(0\)狀態,而SG值不為\(0\)的狀態則不一樣。那么SG值為\(0\)的狀態就是必敗狀態的定義,SG值不為\(0\)的狀態就是必勝狀態的定義,所以我們只需要用集合S求出每個狀態的SG值即可。

類似代碼請見[POJ2960]S-Nim

例3:取石子游戲之三

\(n\)個石子,\(A,B\)兩人輪流取石子,規定他們每次至多只能取當前石子總數\(\lceil \dfrac{s}{2}\rceil\)個石子,問\(A\)先手是否有必勝策略

這題主要是為了加強大家對SG函數的理解,我們考慮從\(0\)開始

\(SG(0)=0,SG(1)=1,SG(2)=0,SG(3)=mex\{SG(3-1),SG(3-2)\}=2\)
\(SG(4)=mex\{SG(4-1),SG(4-2)\}=1...\)

我們把他們列出來找下規律:

0,1
0,2,1,3
0,4,2,5,1,6,3,7
0,8,4,9,2,10...

好像有個很奇怪的規律:數列在間隔遞增,上一行的數間隔着插在下一行的數中間。沒錯,這就是本題SG函數的規律,先手必敗當且僅當SG值為\(0\)

例4:取石子游戲之四(Nim游戲)

\(n\)堆石子,石子數目分別為\(x_{1},x_{2},...,x_{n}\)\(A,B\)兩人每次可以選一堆石子取走任意多個,問\(A\)先手是否有必勝策略。

這題相當於例2的擴展版本,由於這里有多堆石子,因此我們可以得到多個SG值,而且這些SG值必定為\(x_{1},x_{2},...,x_{n}\),那么我們怎么由這一些SG值得到整局游戲的SG值呢?

Nim游戲的神奇之處在於它的SG值和異或扯上了關系,Nim游戲中先手必敗當且僅當\(x_{1}\oplus x_{2}\oplus...\oplus x_{n}=0\),\((\oplus\)為異或),那么,這個為什么是成立的?

首先,\(\oplus\)滿足如下定律和性質

  • 交換律:\(x\oplus y=y\oplus x\)
  • 結合律:\(x\oplus(y\oplus z)=(x\oplus y)\oplus z\)
  • 擁有單位元:\(0\oplus x=x\)
  • 相同兩數運算為0:\(x\oplus x=0\)
  • 消除律:\(x\oplus y=x\oplus z\Rightarrow y=z\)

當Nim游戲的SG值為\(0\)時,我們假定取\(x_{k}\)中的某些石子,使得其變成\(x_{k}'\),我們假設\(x_{1}\oplus x_{2}\oplus...\oplus x_{k}\oplus...\oplus x_{n}=0=x_{1}\oplus x_{2}\oplus...\oplus x_{k}'\oplus...\oplus x_{n}\),根據消除律可得,\(x_{k}=x_{k}'\),這與我們的條件相矛盾,因此說明在取了石子之后,SG必然發生了改變;

那么對於一個SG值不為\(0\)的狀態,我們必然可以通過一個操作,使得SG值變\(0\)。我們只需要找到當前SG最左端為\(1\)的一列(二進制),任意找到一堆石子使得那一列同樣為\(1\),從這堆中取走若干個石子,使得SG'值為\(0\)。這是顯然可以的,因為將那一列變成\(0\),這個數就必然變小了,對於其他列只需要把\(0\)變成\(1\)\(1\)變成\(0\)即可。

因此,我們得到,對於Nim游戲而言,必敗狀態當且僅當\(x_{1}\oplus x_{2}\oplus...\oplus x_{n}=0\),對於其他情況,先手必能使當前局面變成必敗狀態。

代碼請見[POJ2975]Nim

例5:取石子游戲之五(Nimk)

\(n\)堆石子,石子數目分別為\(x_i\)\(A,B\)兩人每次可以選取最多\(k\)堆石子,並從選中的每堆石子堆中取走任意多的石子,問\(A\)是否有必勝策略

首先這題又稱Nimk,那么肯定和Nim游戲有關聯,其實Nimk就是Nim游戲的一個簡單擴展

Nimk存在必勝策略,當且僅當,將所有石子數轉成二進制后,存在某位上,所有二進制數中1的個數之和\(\%(k+1)\)不為\(0\),用數學語言表述,則存在一個數\(t\),使得\((\sum\limits_{i=1}^n x_i\land2^{t-1})\%(k+1)\ne 0\)

如何證明?首先終止局面全為\(0\),滿足必敗條件

對於任意一種必勝狀態,必然存在一種取石子方式,使得其可以轉移到必敗狀態。我們設必勝狀態下,\(1\)的個數\(\%(k+1)\)不為\(0\)的最高二進制位上有\(m\)\(1\),則將這些\(1\)都改成\(0\)需要更改\(m\)堆;若遇到下一個二進制位上,\(1\)的個數\(\%(k+1)\)不為\(0\),記該位上有\(r\)\(1\),並且記之前改變的\(m\)堆在該位上有\(a\)\(1\)\(b\)\(0\)(所有變量都是在\(\%(k+1)\)之后的值)

然后我們分情況討論:

  • \(a\geqslant r\),則將\(r\)\(1\rightarrow0\)
  • \(b\geqslant k+1-r\),則將\(k+1-r\)\(0\rightarrow 1\)
  • \(a<r\)\(b<k+1-r\),則我們改變之前\(m\)堆以外的\(r-a\)堆,那么此時我們改變的堆數為\(m+r-a\Rightarrow a+b+r-a\Rightarrow b+r\),又因為\(b+r<k+1-r+r\Rightarrow k+1\),所以我們改變的堆數\(m-r+a<k+1\),那么這樣的改法是合法的

重復上述操作,我們必然能使每一位上的\(1\)的個數\(\%(k+1)\)\(0\),即轉移到先手必敗態

那么對於任意一個先手必敗態而言,由於我們每次最多只能選取\(k\)堆,所以我們不能在同一二進制位上改變\(k+1\)個值;而且每次改變會導致一系列的連鎖反應,因此我們無法從一個先手必敗態轉移到先手必敗態,證畢

其實Nim游戲相當於Nimk中\(k=1\)的情況……

例6:取石子游戲之六(Wythoff's Game)

有兩堆石子,個數為\(x_{1},x_{2}\)\(A,B\)輪流取石子,規定要么只取一堆的任意多個,要么在兩堆里取同樣任意多個,問\(A\)先手是否有必勝策略。

這種情況下是頗為復雜的,普通SG函數已經無法解決這個問題。我們用\((a_{k},b_{k}),(a_{k} \leqslant b_{k},k \in [0,n])\)表示兩堆物品的數量並稱其為局勢,如果甲面對\((0,0)\),那么甲已經輸了,這種局勢我們稱為奇異局勢。

那么,我們該如何去找到這些奇異局勢呢?

首先我們知道,局勢\((x,y)\)和局勢\((y,x)\)是等價的。考慮遞推的思想,我們已經知道\((0,0)\)是個奇異局勢,也就是個先手必敗態,那么根據定義,能夠到達\((0,0)\)狀態都為先手必勝態,也就不是奇異局勢。

我們從直角坐標系來考慮,\((0,0)\)為奇異局勢后,那么\((0,k),(k,0),(k,k)\)都是非奇異狀態,我們把它們划去,然后找到第一個沒有被划的點,也就是\((1,2)\)\((2,1)\)(因為他倆對稱),然后按同樣的方法處理,之后找到\((3,5)\)\((5,3)\)...

這樣我們可以得到前幾個奇異局勢是:\((0,0)\)\((1,2)\)\((3,5)\)\((4,7)\)\((6,10)\)\((8,13)\)\((9,15)\)\((11,18)\)\((12,20)\)...

通過找規律,我們大膽猜測一下\((a_{k},b_{k})\)滿足:

  • \(a_{k}\)是未在之前出現過的最小自然數

  • \(b_{k}=a_{k}+k\)

下面我們給出其證明:

  • 根據我們尋找奇異局勢的方法,可以得知\(a_{k}\)為之前未出現的最小自然數

  • 我們使用數學歸納法,假定之前的\(k\in[1,n],(a_{k},a_{k}+k)\)都為奇異局勢,我們只需要證明\((a_{n+1},a_{n+1}+n+1)\)為奇異局勢即可

    從局勢\((a_{n+1},a_{n+1}+n+1)\)出發,只可能走向三種狀態,從左邊拿一點,從右邊拿一點,或者兩邊一起拿一點:

    情況一:因為比\(a_{n+1}\)小的數在之前都出現過,所以一旦左邊少了,我們只要把右邊拿到相同的情況即可

    情況二(右邊取的較少):這樣使得兩堆之間差值變小了,變成了\((a_{n+1},a_{n+1}+m)\),這樣我們拿成\((a_{m},a_{m}+m)\)即可

    情況二(右邊取的較多):這樣使得右邊比左邊少了,這樣就變成了和情況一類似,可以直接取到奇異局勢

    情況三:若拿成\((a_{m},a_{m}+n+1)\),我們直接取成\((a_{m},a_{m}+m)\)即可

奇異局勢還有如下三條性質:

  • 任何自然數都包含在一個且僅有一個奇異局勢中。
  • 任意操作都可將奇異局勢變為非奇異局勢。
  • 采用適當的方法,可以將非奇異局勢變為奇異局勢。

我們同樣給出其證明:

  • 由於\(a_{k}\)是未在前面出現過的最小自然數,所以有\(a_{k}>a_{k-1}\) ,而\(b_{k}=a_{k}+k>a_{k-1}+k-1=b_{k-1}>a_{k-1}\) 。所以性質1,成立。

  • 若只改變奇異局勢\((a_{k},b_{k})\)的某一個分量,那么另一個分量不可能在其他奇異局勢中,所以必然是非奇異局勢。如果使\((a_{k},b_{k})\)的兩個分量同時減少,則由於其差不變,且不可能是其他奇異局勢的差,因此也是非奇異局勢。

  • 假設面對的局勢是\((a,b)\)

    如果 \(a=b\),則同時從兩堆中取走\(a\) 個物體,就變為了奇異局勢\((0,0)\)

    如果\(a=a_{k},b>b_{k}\),那么,取走\(b-b_{k}\)個物體,即變為奇異局勢;

    如果\(a=a_{k},b<b_{k}\),則同時從兩堆中拿走\(a_{k}-a_{b-a_{k}}\)個物體,變為奇異局勢\((a_{b-a_{k}},a_{b-a_{k}}+b-a_{k})\)

    如果\(a>a_{k},b=a_{k}+k\),則從第一堆中拿走多余的數量\(a-a_{k}\)即可;

    如果\(a<a_{k},b=a_{k}+k\),分兩種情況:

    • 第一種,\(a=a_{j},(j<k)\),從第二堆里面拿走\(b-b_{j}\)即可;
    • 第二種,\(a=b_{j},(j<k)\),從第二堆里面拿走\(b-a_{j}\)即可。

從如上性質可知,兩個人如果都采用正確操作,那么面對非奇異局勢,先拿者必勝;反之,則后拿者取勝。

而且,通過如上性質,我們可以發現,\(a_{n},b_{n}\)很像Beatty數列。其實,\(a_{n},b_{n}\)就是Beatty數列

下面介紹下Beatty數列Beatty定理

取正無理數\(\alpha,\beta\),使得\(\frac{1}{\alpha}+\frac{1}{\beta}=1\)

構造兩個數列\(a_{n},b_{n}\),它們的通項為\(a_{n}=\lfloor{\alpha n}\rfloor,b_{n}=\lfloor{\beta n}\rfloor\)

那么這個數列顯然是正整數序列,Beatty定理指出,兩個數列都是嚴格遞增的,並且每個正整數在兩個數列中只出現一次

我們給出其證明:

  • 單調性:因為\(\frac{1}{\alpha}<1,\alpha>1\),所以\(\alpha n-1>\alpha (n-1)\),所以\(a_{n}-1>a_{n-1}\)\(b_{n}\)也亦然如此。
  • 完備性:我們要證明這個命題,只需要證明對於任意一個\(k,(k \in Z^*)\),小於等於\(k\)的數在序列中出現了\(k-1\)次即可。

設數列\(a_{n}\)的前\(p\)項小於等於\(k\)(不包括\(p+1\)項),又因為每項取整前為無理數,不可能取到整數值,那么就有

\(\begin{cases}\alpha p<k+1\\\alpha (p+1)>k+1\end{cases}\)

合並兩式,得到\(p=\lfloor\frac{k+1}{\alpha}\rfloor\),這就是小於等於\(k\)的數在\(a_{n}\)中的出現次數,同理,我們可以得到其在\(b_{n}\)中的出現次數,那么我們有小於等於\(k\)的數在Beatty數列中的總出現數\(S=\lfloor\frac{k+1}{\alpha}\rfloor+\lfloor\frac{k+1}{\beta}\rfloor\)

注意到兩個取整函數中的數都是無理數,於是我們就有嚴格的不等式

\((\frac{k+1}{\alpha}-1)+(\frac{k+1}{\beta}-1)<S<\frac{k+1}{\alpha}+\frac{k+1}{\beta}\)
於是有\(k-1<S<k+1\),那么\(S=k\),證畢。

我們回到之前的奇異局勢,由於奇異局勢中的\(a_{n},b_{n}\)序列滿足Beatty數列,那么同樣滿足其構造方法,即\(a_{n}=\lfloor\alpha n\rfloor,b_{n}=\lfloor\beta n\rfloor\)\(\frac{1}{\alpha}+\frac{1}{\beta}=1\)

因為\(a_{n}+n=(\alpha +1)n=b_{n}\),所以\(\frac{1}{\alpha}+\frac{1}{\alpha +1}=1\),解得\(\alpha=\frac{\sqrt{5}+1}{2}\)

那么,我們就得到了通項式:\(a_{k}=\lfloor{k×\frac{\sqrt{5}+1}{2}}\rfloor,b_{k}=a_{k}+k\)

所以對於任意局勢,先手必敗當且僅當局勢為奇異局勢,我們只需要用通項式判斷其是否為奇異局勢即可。

代碼請見[SHOI2002]取石子游戲之三

例7:取石子游戲之七(Fibonacci Nim)

有一堆個數為\(n\)的石子,\(A,B\)輪流取石子,滿足:

  • 先手不能在第一次把所有的石子取完;
  • 之后每次可以取的石子數介於\(1\)到對手剛取的石子數的\(2\)倍之間(包含\(1\)和對手剛取的石子數的\(2\)倍)。

約定取走最后一個石子的人為贏家,問\(A\)先手是否有必勝策略。

這個和之前的Wythoff's Game和取石子游戲有一個很大的不同點,就是游戲規則的動態化。之前的規則中,每次可以取的石子的策略集合是基本固定的,但是這次有規則:一方每次可以取的石子數依賴於對手剛才取的石子數。

這個游戲叫做Fibonacci Nim,肯定和Fibonacci數列\(1,2,3,5,8,13,21,34,55,89,…\) 有密切的關系。如果試驗一番之后,可以猜測:先手勝當且僅當n不是Fibonacci數。換句話說,必敗態構成Fibonacci數列

就像Wythoff博弈需要Beatty定理來幫忙一樣,這里需要借助Zeckendorf定理(齊肯多夫定理):任何正整數可以表示為若干個不連續的Fibonacci數之和。

首先我們證明下Zeckendorf定理(齊肯多夫定理)

我們以\(Fib_{n}\)代表Fibnacci數列的第\(n\)項,\(m,(m \in Z^*)\),易知當\(m=1,2,3\)時,該定理都成立,那么我們運用數學歸納法:假定該定理對所有小於\(m\)的數都成立,我們只要證明該定理對\(m\)成立即可。

  • \(m\)\(Fib\)數時,該定理成立
  • \(m\)不為\(Fib\)數時,設\(Fib_{p_{1}}<m<Fib_{p_{1}+1}\)

\(m'=m-Fib_{p_{1}}<Fib_{p_{1}+1}-Fib_{p_{1}}=Fib_{p_{1}-1}\),即\(m'<Fib_{p_{1}-1}\)

因為\(m'<m\),又因為歸納法假設\(m'\)可以表示成不連續的Fibnacci數列之和,即\(m'=Fib_{p_{2}}+Fib_{p_{3}}+...+Fib_{p_{t}},(p_{2}>p_{3}>...>p_{t})\)且不是連續的整數,又因為\(m'<Fib_{p_{1}-1}\),所以\(p_{2}<p_{1}-1\),即\(p_{1},p_{2}\)也不是連續的整數。

\(m=m'+Fib_{p_{1}}=Fib_{p_{1}}+Fib_{p_{2}}+...+Fib_{p_{t}},(p_{1}>p_{2}>...p_{t})\)且不是連續的整數,所以該定理成立

所以Zeckendorf定理(齊肯多夫定理)對所有的\(m,(m \in Z^*)\)都成立

那我們再看看Fibnacci數列必敗證明

首先給出三個定理,之后證明需要用到:

  • \(Fib_{n+1}<2*Fib_{n}<Fib_{n+2}\)
  • \(Fib_{n+2}<3*Fib_{n}\)
  • \(4*Fib_{n}<3*Fib_{n+1},(4*Fib_{n}<3*(Fib_{n}+Fib_{n-1})\Rightarrow Fib_{n}<Fib_{n+1}<3*Fib_{n-1})\)

同樣運用數學歸納法:

  • \(i=2\)時,先手只能取1顆,顯然必敗,結論成立。
  • 假設當\(i \leqslant k\)時,結論成立。

則當\(i=k+1\)時,\(Fib_{i}=Fib_{k}+Fib_{k-1}\)

則我們可以把這一堆石子看成兩堆,簡稱\(k\)堆和\(k-1\)堆。

(一定可以看成兩堆,因為假如先手第一次取的石子數大於或等於\(Fib_{k-1}\),則后手可以直接取完\(Fib_{k}\),因為\(Fib_{k}<2*Fib_{k-1}\))

對於\(k-1\)堆,由假設可知,不論先手怎樣取,后手總能取到最后一顆。下面我們分析一下后手最后取的石子數\(x\)的情況。

如果先手第一次取的石子數\(y \geqslant \dfrac{Fib_{k-1}}{3}\),則這小堆所剩的石子數小於等於\(2y\),即后手可以直接取完,此時\(x=Fib_{k-1}-y\),則\(x \leqslant \dfrac{2*Fib_{k-1}}{3}\)

我們來比較一下\(\dfrac{2*Fib_{k-1}}{3}\)\(\dfrac{Fib_{k}}{2}\)的大小。即\(4*Fib_{k-1}\)\(3*Fib_{k}\)的大小,我們已經得出后者大。

所以我們得到,\(x<\dfrac{Fib_{k}}{2}\)

即后手取完\(k-1\)堆后,先手在能取最多石子的情況下不能一次性取完\(k\)堆,所以游戲規則沒有改變,則由假設可知,對於\(k\)堆,后手仍能取到最后一顆,所以后手必勝。

\(i=k+1\)時,結論依然成立。

對於不是Fibonacci數列,首先進行分解。

分解的時候,要取盡量大Fibonacci數

比如分解\(85\)

\(85\)\(55\)\(89\)之間,於是可以寫成\(85=55+30\),然后繼續分解\(30\)\(30\)\(21\)\(34\)之間,所以可以寫成\(30=21+9\),依此類推,最后分解成\(85=55+21+8+1\)

則我們可以把\(n\)寫成\(n=Fib_{p_{1}}+Fib_{p_{2}}+……+Fib_{p_{k}},(p_{1}>p_{2}>……>p_{k})\)
我們令先手先取完\(Fib_{p_{k}}\),即最小的這一堆。由於各個\(Fib\)之間不連續,則\(p_{k-1}>p_{k}+1\),則有\(Fib_{p_{k-1}}>2*Fib_{p_{k}}\)。即后手只能取\(Fib_{p_{k-1}}\)這一堆,且不能一次取完。

此時后手相當於面臨這個子游戲(只有\(Fib_{p_{k-1}}\)這一堆石子,且后手先取)的必敗態,即先手一定可以取到這一堆的最后一顆石子。

同理可知,對於以后的每一堆,先手都可以取到這一堆的最后一顆石子,從而獲得游戲的勝利。

代碼請見[COCI2010]HRPA

例8:取石子游戲之八(Staircase Nim)

\(n\)堆石子,每堆石子的數量為\(x_{1},x_{2},...,x_{n}\)\(A,B\)輪流操作,每次可以選第\(k\)堆中的任意多個石子放到第\(k-1\)堆中,第\(1\)堆中的石子可以放到第\(0\)堆中,最后無法操作的人為輸。問\(A\)先手是否有必勝策略。

Staircase Nim又名階梯Nim,它其實可以通過一些轉化變成我們所熟知的Nim游戲,先手必敗當且僅當奇數階梯上的石子數異或和為\(0\),那么為什么是這樣呢?

假如我們是先手,我們就按照這個方法將多余的石子從奇數堆移動到偶數堆里面。

此后如果對手移動的是奇數堆,我們就繼續移動奇數堆使得SG值重新變為\(0\);如果對手移動的是偶數堆,我們就將他移動到奇數堆中的石子繼續往下移。

這樣經過多次操作我們總能使奇數堆保持必勝狀態,最后我們總可以在對手之后將石子從奇數堆移動到偶數堆,最后移動到第\(0\)堆,這樣對手就不能移動了。

所以通過整個過程我們可以發現,偶數堆中的石子不會影響整個游戲的結果,只有奇數堆中的石子會影響游戲結果。

因此對這個游戲而言,先手必敗當且僅當奇數堆中的石子數異或和為\(0\)

類似代碼請見[POI2004]GRA

例9:取石子游戲之九(Anti Nim)

本題為例4(Nim 游戲)的變相版本,其他條件均不變,唯獨定義:取到最后一個石子的人為輸。那么\(A\)先手是否有必勝策略?

這題和Nim游戲非常類似,就是輸贏的條件不同,但是這個游戲的勝利狀態卻和Nim有一些區別,這個游戲的的勝利當且僅當:

  • 所有堆石子數都為\(1\)且SG值為\(0\)
  • 至少有一堆石子數大於\(1\)且SG值不為\(0\)

我們對這個游戲進行分析,將其分為兩種情況:

  • 所有堆的石子數均為\(1\)
  • 至少有一堆石子數大於\(1\)

對於第一種情況而言,我們可以很容易得到當堆數為奇數時,先手必敗,否則先手必勝。

對於第二種情況而言,我們分兩種情況進行討論:

  • 當SG值不為\(0\)時:
    若還有兩堆石子數目大於\(1\)時,我們將SG值變為\(0\)即可;若只有一堆石子數目大於\(1\)時,我們總可以讓狀態變成有奇數個\(1\)。所以當SG不為0時,先手必勝。
  • 當SG值為\(0\)時:
    這樣的話至少會有兩堆石子的數目大於\(1\),那么先手決策完之后,必定會使局面的SG值不為\(0\),這樣便到了先手必勝局。所以當SG為\(0\)時,先手必敗。

代碼請見[SHOI2008]小約翰的游戲

但是上述有關的推導只對於Anti Nim成立,對與Anti SG-組合游戲這個推論是不成立的,因此Anti SG-組合游戲的推論我們是需要重新證明的。不過這篇博客主要討論單一游戲的決策問題,因此對於SG-組合游戲不予以討論,有興趣的讀者可以參考賈志豪《組合游戲略述——淺談SG游戲的若干拓展及變形》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM