博弈論中nim k、anti-nim、every-sg、翻硬幣問題、樹上刪邊介紹

正在施工中博弈論小結


bash博弈
nim遊戲
sg函數
[階梯nim](https://www.cnblogs.com/RogerDTZ/p/9439540.html)
威佐夫博弈
[斐波那契博弈](https://www.cnblogs.com/Ritchie/p/5762320.html)
**打表找規律**[HDU1517](https://vjudge.net/problem/HDU-1517)
對偶博弈
海盜分金(爲什麼後來金幣數不確定?)

👆這些以上都沒有

nim k

問題形式:有若干博弈遊戲,每次可以一下子進行最多k個遊戲,誰無法進行誰輸。
結論:整個遊戲的SG = 每個遊戲的sg用二進制表示的同時用(k+1)進制異或

爲更具體地解釋,我們編一道題:有n堆石子,分別有ai個石子,每次可以對最多k,最少1堆進行操作,即取走該堆任意個石子。兩人輪流進行,取走最後一個石子的獲勝。問是否先手必勝。
設sg[i]爲第i堆的sg值。結合以前的經驗,我們知道sg[i]=ai。我們依然求這n堆異或。異或可看做「不進位加法」,我們用每個數的二進制表示,進行(k+1)進制的「不進位加法」。舉個例子,若三個數的二進制是10101011010101 11110111111011 00101010010101假設k=2,即要三進制,那麼相應三進制的異或爲21012102101210
爲什麼這麼做呢?我認爲,這樣每個遊戲對最高爲的貢獻最多爲1,這樣就可以保證SG=0時先手在取最多k個的情況下無法再次將SG變爲0;SG>0的情況下,假設最高位數值爲t,先手可以進行t個遊戲使SG變爲0。

例題:Football Game POJ - 2315

anti-nim

反nim博弈。 anti-nim是有幾堆石子,每次可以拿某一堆中的任意多個(不能不拿),誰取完最後一個石子誰「輸」。

結論:

  • 若每堆石子數=1,則xor之和爲0必勝,否則必敗
  • 若有一堆>1,則xor之和非0必勝,否則必敗

以下爲我覺得正確的證明。
摘抄複製了一下一篇知乎上的回答

奇異局勢:所有堆xor之和爲0的情況。
令S表示非奇異局勢,T表示奇異局勢;
規定一堆中石子數>1,則爲充裕堆;=1,則爲孤單堆。
S0:非奇異局勢且充裕堆數爲0;
S1:非奇異局勢且充裕堆數爲1;
S2:非奇異局勢且充裕堆數爲2;
T0:奇異局勢且充裕堆數爲0;
T2:奇異局勢且充裕堆數爲2;
衆所周知 T1不存在)

先考慮這5個狀態的勝負。
無需多說,S0必敗,T0必勝。
S1可轉移到S0,因此S1必勝。
T2只能轉移到S2或S1。若轉移到S1,則T2必敗;若轉移到S2,則對方可再次轉移到T2。因此T2爲必敗態,S2爲必勝態。

現在,必勝:T0,S1,S2;
必敗:S0,T2

接着,我們歸納一下:
當n>=2時,假設S1,S2,…,Sn都是必勝態,T2,T3,…,Tn都是必敗態,由於T(n+1)只能轉移到Sn或S(n+1),而S(n+1)可以轉移到T(n+1)或T(n),因此T(n+1)是必敗態,S(n+1)是必勝態。這樣,除去S0,所有S都是必勝態;除去T0,所有T都是必敗態。

丟一道例題:Be the Winner HDU - 2509

every-sg

基本形式:有n個博弈遊戲同時進行,輪到他時必須玩所有還沒結束的遊戲。最後結束的遊戲的輸贏就是整個遊戲的輸贏。

這種題增加了一個性質:步數。
容易想到,每局遊戲如果能贏,一定要贏,而且往後拖得越久越好;如果必輸,一定輸得越快越好。令ans爲最後結束的那個遊戲的步數,則ans爲奇數時先手贏,偶數時後手贏。
step()={0已經輸了max{step()}+1sg(當前狀態)!=0min{step()}+1sg(當前狀態)=0step(當前狀態)=\begin{cases} 0& \text{已經輸了}\\ max\{step(所有必輸的上一狀態)\}+1& \text{sg(當前狀態)!=0}\\ min\{step(上一狀態)\}+1& \text{sg(當前狀態)=0} \end{cases}

例題:GG and MM HDU - 3595

翻硬幣問題

基本形式:有一排硬幣,從左到右分別標號1,2,…,兩人輪流按一定限制翻硬幣,但選擇的最右邊的硬幣一定是從正面朝上翻到反面朝上,不能翻的人輸。
結論:整個局面的sg等於每個朝上的硬幣的sg的異或值
換句話說,令sg[i]爲只有i號硬幣朝上時的sg值,那麼整個局面的sg爲sg[a1]sg[a2]...sg[ak]sg[a_1] \oplus sg[a_2] \oplus ... \oplus sg[a_k],其中ai號硬幣朝上。

怎麼理解呢?爲更具體地表述,我們假設題目條件爲每次可以翻轉1個或2個硬幣。
我們先求sg[i]。設硬幣全反面朝上的狀態爲S0,只有第i號正面朝上爲Si。顯然sg[1]=1。S2可以轉化成S0和S1,因此sg[2]=2。Sk可以通過翻1個轉化爲S0,也可以翻兩個轉化成Sj,1<=j<k,因此sg[k]=k。
現在可以這樣想:假如i號硬幣朝上,那麼將它看做一堆石子,石子數目是i。
現在我們可以用已經求出的sg[i]求出整個局面的sg(簡稱SG)。假定SG>0。對於普通nim遊戲,我們找到SG的二進制表示中1所在的最高位:第a位。假設sg[b]二進制的第a位爲1,那麼我們可以將有b個石子的這一堆(簡稱b堆)拿走一部分,使得SG=0。
對應到硬幣,「將b堆拿完」即「將b號硬幣由正面翻到背面」,「將b堆由原本的b個石子拿得只剩c個」即「將b號硬幣由正面翻到背面,且將c號硬幣翻轉(不管是哪面朝上)」。

因此,這樣的遊戲,先求出sg[i](可以打表找規律),再求出SG。

例題:Daizhenyang’s Coin HDU - 3537(不知道爲什麼,我的代碼總Compilation Error,明明用codeblocks和devc++都沒問題的說)

樹上刪邊

待做題
基本形式:有一棵樹,給定根節點,兩人輪流選擇一條邊,並將其及連帶的子樹刪除,無法操作的輸。
結論:葉子結點的sg=0,其餘點的sg爲「他的孩子的sg+1」的異或和
例題:A tree game HDU - 3094

與樹上刪邊類似的是一種無向圖刪邊,具體請看Christmas Game POJ - 3710。本題奇數邊環可用一條邊代替,偶數邊環可用一個點代替。

不平等博弈

雙方的操作是不同的。比如若干長寬爲正整數的矩形,左方每次橫着切,右方豎着切,要求切完後的兩個矩形長寬都爲正整數,誰不能切誰輸。

法一:
這種題的一般做法是設置一個hp值,如n*1的矩形hp=n-1,1*m的矩形hp=-(m-1),我們是根據左方定的正負,hp爲正代表對左方有利,爲負代表對右方有利。假定每個矩形都有一個hp,那麼當hp之和>0則左方必贏,<0則右方必贏,=0則後手必贏。
現在的重點就是hp怎麼求了。每個矩陣都有且只有一個hp,它不會對雙方都有利,也不會對雙方有不利。

根據這一理念,先打表。

    for(int i=1; i<N; ++i)
    {
        for(int j=1; j<N; ++j)
        {
            if(i==1) hp[i][j]=j-1;
            else if(j==1) hp[i][j]=1-i;
            else
            {
                for(int k=1; k<j; ++k)
                {
                    hp[i][j]=max(hp[i][j],hp[i][k]+hp[i][j-k]+1);
                }
                for(int k=1; k<i; ++k)
                {
                    hp[i][j]=min(hp[i][j],hp[k][j]+hp[i-k][j]-1);
                }
            }
        }
    }

然後就找規律,然後根據規律迅速求的任意一個矩陣的hp。。。。。在此我就不多說了,因爲剩下的就和普通的博弈論相同了。

這道例題是Alice’s Game HDU - 3544

法二:
有很多不平等博弈論,比如這道題,是可以用surreal number表示的。在此,我推薦Matrix67寫的一篇相當漂亮的文章:實數、超實數和博弈遊戲:數學的結構之美。這篇文章詳細地介紹了surreal number的概念、運算、性質,很不容易理解,但我們只需要會用就夠了。
待施工參考

例題彙總

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章