博弈论 SG函数
別被文章長度嚇到,學(xué)會(huì)博弈(SG)只用看前1/10。
鑒于講明白博弈要敲好多字,于是找了些論文拼湊,對疑難點(diǎn)加了注釋并配上“美圖”助解。
另附上我手敲的精簡版。
Nim游戲
重點(diǎn)結(jié)論:對于一個(gè)Nim游戲的局面(a1,a2,...,an),它是P-position當(dāng)且僅當(dāng)a1^a2^...^an=0,其中^表示位異或(xor)運(yùn)算。
Nim游戲是博弈論中最經(jīng)典的模型(之一?),它又有著十分簡單的規(guī)則和無比優(yōu)美的結(jié)論,由這個(gè)游戲開始了解博弈論恐怕是最合適不過了。
Nim游戲是組合游戲(Combinatorial Games)的一種,準(zhǔn)確來說,屬于“Impartial Combinatorial Games”(以下簡稱ICG)。滿足以下條件的游戲是ICG(可能不太嚴(yán)謹(jǐn)):1、有兩名選手;2、兩名選手交替對游戲進(jìn)行移動(dòng)(move),每次一步,選手可以在(一般而言)有限的合法移動(dòng)集合中任選一種進(jìn)行移動(dòng);3、對于游戲的任何一種可能的局面,合法的移動(dòng)集合只取決于這個(gè)局面本身,不取決于輪到哪名選手操作、以前的任何操作、骰子的點(diǎn)數(shù)或者其它什么因素; 4、如果輪到某名選手移動(dòng),且這個(gè)局面的合法的移動(dòng)集合為空(也就是說此時(shí)無法進(jìn)行移動(dòng)),則這名選手負(fù)。根據(jù)這個(gè)定義,很多日常的游戲并非ICG。例如象棋就不滿足條件3,因?yàn)榧t方只能移動(dòng)紅子,黑方只能移動(dòng)黑子,合法的移動(dòng)集合取決于輪到哪名選手操作。
通常的Nim游戲的定義是這樣的:有若干堆石子,每堆石子的數(shù)量都是有限的,合法的移動(dòng)是“選擇一堆石子并拿走若干顆(不能不拿)”,如果輪到某個(gè)人時(shí)所有的石子堆都已經(jīng)被拿空了,則判負(fù)(因?yàn)樗丝虥]有任何合法的移動(dòng))。
這游戲看上去有點(diǎn)復(fù)雜,先從簡單情況開始研究吧。如果輪到你的時(shí)候,只剩下一堆石子,那么此時(shí)的必勝策略肯定是把這堆石子全部拿完一顆也不給對手剩,然后對手就輸了。如果剩下兩堆不相等的石子,必勝策略是通過取多的一堆的石子將兩堆石子變得相等,以后如果對手在某一堆里拿若干顆,你就可以在另一堆中拿同樣多的顆數(shù),直至勝利。如果你面對的是兩堆相等的石子,那么此時(shí)你是沒有任何必勝策略的,反而對手可以遵循上面的策略保證必勝。如果是三堆石子……好像已經(jīng)很難分析了,看來我們必須要借助一些其它好用的(最好是程式化的)分析方法了,或者說,我們最好能夠設(shè)計(jì)出一種在有必勝策略時(shí)就能找到必勝策略的算法。
定義P-position和N-position,其中P代表Previous,N代表Next。直觀的說,上一次move的人有必勝策略的局面是P-position,也就是“后手可保證必勝”或者“先手必?cái) ?#xff0c;現(xiàn)在輪到move的人有必勝策略的局面是N-position,也就是“先手可保證必勝”。更嚴(yán)謹(jǐn)?shù)亩x是:1.無法進(jìn)行任何移動(dòng)的局面(也就是terminal position)是P-position;2.可以移動(dòng)到P-position的局面是N-position;3.所有移動(dòng)都導(dǎo)致N-position的局面是P-position。
按照這個(gè)定義,如果局面不可能重現(xiàn),或者說positions的集合可以進(jìn)行拓?fù)渑判?#xff0c;那么每個(gè)position或者是P-position或者是N-position,而且可以通過定義計(jì)算出來。
以Nim游戲?yàn)槔齺磉M(jìn)行一下計(jì)算。比如說我剛才說當(dāng)只有兩堆石子且兩堆石子數(shù)量相等時(shí)后手有必勝策略,也就是這是一個(gè)P-position,下面我們依靠定義證明一下(3,3)是一個(gè)P是一個(gè)P是一個(gè)P-position。首先(3,3)的子局面(也就是通過合法移動(dòng)可以導(dǎo)致的局面)有(0,3)(1,3)(2,3)(顯然交換石子堆的位置不影響其性質(zhì),所以把(x,y)和(y,x)看成同一種局面),只需要計(jì)算出這三種局面的性質(zhì)就可以了。 (0,3)的子局面有(0,0)、(0,1)、(0,2),其中(0,0)顯然是P-position,所以(0,3)是N-position(只要找到一個(gè)是P-position的子局面就能說明是N-position)。(1,3)的后繼中(1,1)是P-position(因?yàn)?1,1)的唯一子局面(0,1)是N-position),所以(1,3)也是N-position。同樣可以證明(2,3)是N-position。所以(3,3)的所有子局面都是N-position,它就是P-position。通過一點(diǎn)簡單的數(shù)學(xué)歸納,可以嚴(yán)格的證明“有兩堆石子時(shí)的局面是P-position當(dāng)且僅當(dāng)這兩堆石子的數(shù)目相等”。
根據(jù)上面這個(gè)過程,可以得到一個(gè)遞歸的算法——對于當(dāng)前的局面,遞歸計(jì)算它的所有子局面的性質(zhì),如果存在某個(gè)子局面是P-position,那么向這個(gè)子局面的移動(dòng)就是必勝策略。當(dāng)然,可能你已經(jīng)敏銳地看出有大量的重疊子問題,所以可以用DP或者記憶化搜索的方法以提高效率(簡單的博弈問題想到這一步就可以了)。但問題是,利用這個(gè)算法,對于某個(gè)Nim游戲的局面(a1,a2,...,an)來說,要想判斷它的性質(zhì)以及找出必勝策略,需要計(jì)算O(a1*a2*...*an)個(gè)局面的性質(zhì),不管怎樣記憶化都無法降低這個(gè)時(shí)間復(fù)雜度。所以我們需要更高效的判斷Nim游戲的局面的性質(zhì)的方法。
直接說結(jié)論好了。(Bouton'sTheorem)對于一個(gè)Nim游戲的局面(a1,a2,...,an),它是P-position當(dāng)且僅當(dāng)a1^a2^...^an=0,其中^表示異或(xor)運(yùn)算。怎么樣,是不是很神奇?我看到它的時(shí)候也覺得很神奇,完全沒有道理的和異或運(yùn)算扯上了關(guān)系。但這個(gè)定理的證明卻也不復(fù)雜,基本上就是按照兩種position的證明來的。
根據(jù)定義,證明一種判斷position的性質(zhì)的方法的正確性,只需證明三個(gè)命題: 1、這個(gè)判斷將所有terminal position判為P-position;2、根據(jù)這個(gè)判斷被判為N-position的局面一定可以移動(dòng)到某個(gè)P-position;3、根據(jù)這個(gè)判斷被判為P-position的局面無法移動(dòng)到某個(gè)P-position。
第一個(gè)命題顯然,terminalposition只有一個(gè),就是全0,異或仍然是0。
第二個(gè)命題,對于某個(gè)局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某個(gè)合法的移動(dòng),將ai改變成ai'后滿足a1^a2^...^ai'^...^an=0。不妨設(shè)a1^a2^...^an=k,則一定存在某個(gè)ai,它的二進(jìn)制表示在k的最高位上是1(否則k的最高位那個(gè)1是怎么得到的)。這時(shí)ai^k<ai一定成立。則我們可以將ai改變成ai'=ai^k,此時(shí)a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。
第三個(gè)命題,對于某個(gè)局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某個(gè)合法的移動(dòng),將ai改變成ai'后滿足a1^a2^...^ai'^...^an=0。因?yàn)楫惢蜻\(yùn)算滿足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以將ai改變成ai'不是一個(gè)合法的移動(dòng)。證畢。
根據(jù)這個(gè)定理,我們可以在O(n)的時(shí)間內(nèi)判斷一個(gè)Nim的局面的性質(zhì),且如果它是N-position,也可以在O(n)的時(shí)間內(nèi)找到所有的必勝策略。Nim問題就這樣基本上完美的解決了。
?
Sprague-Grundy函數(shù)
上一期的文章里我們仔細(xì)研究了Nim游戲,并且了解了找出必勝策略的方法。但如果把Nim的規(guī)則略加改變,你還能很快找出必勝策略嗎?比如說:有n堆石子,每次可以從第1堆石子里取1顆、2顆或3顆,可以從第2堆石子里取奇數(shù)顆,可以從第3堆及以后石子里取任意顆……這時(shí)看上去問題復(fù)雜了很多,但相信你如果掌握了本節(jié)的內(nèi)容,類似的千變?nèi)f化的問題都是不成問題的。
現(xiàn)在我們來研究一個(gè)看上去似乎更為一般的游戲:給定一個(gè)有向無環(huán)圖和一個(gè)起始頂點(diǎn)上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進(jìn)行移動(dòng),無法移動(dòng)者判負(fù)。事實(shí)上,這個(gè)游戲可以認(rèn)為是所有Impartial Combinatorial Games的抽象模型。也就是說,任何一個(gè)ICG都可以通過把每個(gè)局面看成一個(gè)頂點(diǎn),對每個(gè)局面和它的子局面連一條有向邊來抽象成這個(gè)“有向圖游戲”。
下面我們就在有向無環(huán)圖的頂點(diǎn)上定義Sprague-Garundy函數(shù)。
首先定義mex(minimal excludant)運(yùn)算,這是施加于一個(gè)集合的運(yùn)算,表示最小的不屬于這個(gè)集合的非負(fù)整數(shù)。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
對于一個(gè)給定的有向無環(huán)圖,定義關(guān)于圖的每個(gè)頂點(diǎn)的Sprague-Garundy函數(shù)g如下:g(x)=mex{ g(y) | y是x的后繼 }。
來看一下SG函數(shù)的性質(zhì)。首先,所有的terminal position所對應(yīng)的頂點(diǎn),也就是沒有出邊的頂點(diǎn),其SG值為0,因?yàn)樗暮罄^集合是空集。
?
(pic1)
對于一個(gè)g(x)=0的頂點(diǎn)x,它的所有后繼y都滿足g(y)!=0。??N
對于一個(gè)g(x)!=0的頂點(diǎn),必定存在一個(gè)后繼y滿足g(y)=0。??P
以上這三句話表明,頂點(diǎn)x所代表的postion是P-position當(dāng)且僅當(dāng)g(x)=0(跟P-positioin/N-position的定義的那三句話是完全對應(yīng)的)。我們通過計(jì)算有向無環(huán)圖的每個(gè)頂點(diǎn)的SG值,就可以對每種局面找到必勝策略了。但SG函數(shù)的用途遠(yuǎn)沒有這樣簡單。如果將有向圖游戲變復(fù)雜一點(diǎn),比如說,有向圖上并不是只有一枚棋子,而是有n枚棋子,每次可以任選一顆進(jìn)行移動(dòng),這時(shí),怎樣找到必勝策略呢?
讓我們再來考慮一下頂點(diǎn)的SG值的意義。當(dāng)g(x)=k時(shí),表明對于任意一個(gè)0<=i<k,都存在x的一個(gè)后繼y滿足g(y)=i。也就是說,當(dāng)某枚棋子的SG值是k時(shí),我們可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。不知道你能不能根據(jù)這個(gè)聯(lián)想到Nim游戲,Nim游戲的規(guī)則就是:每次選擇一堆數(shù)量為k的石子,可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。這表明,如果將n枚棋子所在的頂點(diǎn)的SG值看作n堆相應(yīng)數(shù)量的石子,那么這個(gè)Nim游戲的每個(gè)必勝策略都對應(yīng)于原來這n枚棋子的必勝策略!
對于n個(gè)棋子,設(shè)它們對應(yīng)的頂點(diǎn)的SG值分別為(a1,a2,...,an),再設(shè)局面(a1,a2,...,an)時(shí)的Nim游戲的一種必勝策略是把a(bǔ)i變成k,那么原游戲的一種必勝策略就是把第i枚棋子移動(dòng)到一個(gè)SG值為k的頂點(diǎn)。這聽上去有點(diǎn)過于神奇——怎么繞了一圈又回到Nim游戲上了。
其實(shí)我們還是只要證明這種多棋子的有向圖游戲的局面是P-position當(dāng)且僅當(dāng)所有棋子所在的位置的SG函數(shù)的異或?yàn)?。這個(gè)證明與上節(jié)的Bouton's Theorem幾乎是完全相同的,只需要適當(dāng)?shù)母膸讉€(gè)名詞就行了。
剛才,我為了使問題看上去更容易一些,認(rèn)為n枚棋子是在一個(gè)有向圖上移動(dòng)。但如果不是在一個(gè)有向圖上,而是每個(gè)棋子在其對應(yīng)的有向圖上,每次可以任選一個(gè)棋子(也就是任選一個(gè)有向圖)進(jìn)行移動(dòng),這樣也不會(huì)給結(jié)論帶來任何變化。
所以我們可以定義有向圖游戲的和(Sum of Graph Games):設(shè)G1、G2、……、Gn是n個(gè)有向圖游戲,定義游戲G是G1、G2、……、Gn的和(Sum),游戲G的移動(dòng)規(guī)則是:任選一個(gè)子游戲Gi并移動(dòng)上面的棋子。Sprague-Grundy Theorem就是:g(G)=g(G1)^g(G2)^...^g(Gn)。也就是說,游戲的和的SG函數(shù)值是它的所有子游戲的SG函數(shù)值的異或。
再考慮在本文一開頭的一句話:任何一個(gè)ICG都可以抽象成一個(gè)有向圖游戲。所以“SG函數(shù)”和“游戲的和”的概念就不是局限于有向圖游戲。我們給每個(gè)ICG的每個(gè)position定義SG值,也可以定義n個(gè)ICG的和。所以說當(dāng)我們面對由n個(gè)游戲組合成的一個(gè)游戲時(shí),只需對于每個(gè)游戲找出求它的每個(gè)局面的SG值的方法,就可以把這些SG值全部看成Nim的石子堆,然后依照找Nim的必勝策略的方法來找這個(gè)游戲的必勝策略了!(Nim其實(shí)就是n個(gè)從一堆中拿石子的游戲求SG的變型,總SG=n個(gè)sg的異或)。(very important)
?
(pic 2) 注:此圖中值非SG值,%4后才是SG值。SG的值根據(jù)mex函數(shù)確定,下面有具體實(shí)現(xiàn)方法(打表or DFS)。
回到本文開頭的問題。有n堆石子,每次可以從第1堆石子里取1顆、2顆或3顆,可以從第2堆石子里取奇數(shù)顆,可以從第3堆及以后石子里取任意顆……我們可以把它看作3個(gè)子游戲,第1個(gè)子游戲只有一堆石子,每次可以取1、2、3顆,很容易(看pic2)看出x%4==0時(shí)處于P局面,即x顆石子的局面的SG值是x%4,(即把.中的值改成原值%4)。第2個(gè)子游戲也是只有一堆石子,每次可以取奇數(shù)顆,經(jīng)過簡單的畫圖可以知道這個(gè)游戲有x顆石子時(shí)的SG值是x%2。第3個(gè)游戲有n-2堆石子,就是一個(gè)Nim游戲。對于原游戲的每個(gè)局面,把三個(gè)子游戲的SG值異或一下就得到了整個(gè)游戲的SG值,然后就可以根據(jù)這個(gè)SG值判斷是否有必勝策略以及做出決策了。其實(shí)看作3個(gè)子游戲還是保守了些,干脆看作n個(gè)子游戲,其中第1、2個(gè)子游戲如上所述,第3個(gè)及以后的子游戲都是“1堆石子,每次取幾顆都可以”,稱為“任取石子游戲”,這個(gè)超簡單的游戲有x顆石子的SG值顯然就是x。其實(shí),n堆石子的Nim游戲本身不就是n個(gè)“任取石子游戲”的和嗎?
所以,對于我們來說,SG函數(shù)與“游戲的和”的概念不是讓我們?nèi)ソM合、制造稀奇古怪的游戲,而是把遇到的看上去有些復(fù)雜的游戲試圖分成若干個(gè)子游戲,對于每個(gè)比原游戲簡化很多的子游戲找出它的SG函數(shù),然后全部異或起來就得到了原游戲的SG函數(shù),就可以解決原游戲了。這種“分而治之”的思想在下一節(jié)介紹的“翻硬幣游戲”中將被應(yīng)用得淋漓盡致。
以下是本文最重要的部分:
解題模型:
1.把原游戲分解成多個(gè)獨(dú)立的子游戲,則原游戲的SG函數(shù)值是它的所有子游戲的SG函數(shù)值的異或。
? ? ? ?即sg(G)=sg(G1)^sg(G2)^...^sg(Gn)。
2.分別考慮沒一個(gè)子游戲,計(jì)算其SG值。
? ? ?SG值的計(jì)算方法:(重點(diǎn))
? ? ??1.可選步數(shù)為1~m的連續(xù)整數(shù),直接取模即可,SG(x) = x % (m+1);
2.可選步數(shù)為任意步,SG(x)?= x;
3.可選步數(shù)為一系列不連續(xù)的數(shù),用模板計(jì)算。
? ? ? ? 模板1:打表
??
//f[]:可以取走的石子個(gè)數(shù) //sg[]:0~n的SG函數(shù)值 //hash[]:mex{} int f[N],sg[N],hash[N]; void getSG(int n) {int i,j;memset(sg,0,sizeof(sg));for(i=1;i<=n;i++){memset(hash,0,sizeof(hash));for(j=1;f[j]<=i;j++)hash[sg[i-f[j]]]=1;for(j=0;j<=n;j++) //求mes{}中未出現(xiàn)的最小的非負(fù)整數(shù){if(hash[j]==0){sg[i]=j;break;}}} }? ? ?
??模板二:DFS
//注意 S數(shù)組要按從小到大排序 SG函數(shù)要初始化為-1 對于每個(gè)集合只需初始化1遍 //n是集合s的大小 S[i]是定義的特殊取法規(guī)則的數(shù)組 int s[110],sg[10010],n; int SG_dfs(int x) {int i;if(sg[x]!=-1)return sg[x];bool vis[110];memset(vis,0,sizeof(vis));for(i=0;i<n;i++){if(x>=s[i]){SG_dfs(x-s[i]);vis[sg[x-s[i]]]=1;}}int e;for(i=0;;i++)if(!vis[i]){e=i;break;}return sg[x]=e; }
一般DFS只在打表解決不了的情況下用,首選打表預(yù)處理。
如
LightOJ 1315Game of Hyper Knights,此題打表不好處理,只好DFS。
3.計(jì)算sg(G)=sg(G1)^sg(G2)^...^sg(Gn), ? ? sg(G)=0,即P-Position,即先手比敗。
看完以上部分,學(xué)會(huì)SG,博弈不成問題。
下文講的都是些應(yīng)用,加深理解,可忽略。。。
?
Game theory初步
游戲1
l??? 有兩個(gè)游戲者:A和B。
l??? 有21顆石子。
l??? 兩人輪流取走石子,每次可取1、2或3顆。
l??? A先取。
l??? 取走最后一顆石子的人獲勝,即沒有石子可取的人算輸。
如果剩下1、2或3顆石子,那么接下來取的人就能獲勝;如果剩下4顆,那么無論接下來的人怎么取,都會(huì)出現(xiàn)前面這種情況,所以接下來取的人一定會(huì)輸;如果剩下5、6或7顆石子,那么接下來取的人只要使得剩下4顆石子,他就能獲勝。0,4,8,12,……都是下一個(gè)取石子者的必?cái)顟B(tài)。現(xiàn)在有21顆石子,21除以4的余數(shù)是1,所以先走者有必勝的策略,他第一次只要取走1顆石子,以后每一次都保證剩下的石子是4的倍數(shù)就行了。
什么是“平等組合游戲”?
l??? 兩人游戲。
l??? 有一個(gè)狀態(tài)集,而且通常是有限的。
l??? 規(guī)定哪些狀態(tài)轉(zhuǎn)移是允許的。
l??? 所有規(guī)定對于兩人來說是一樣的。
l??? 兩人輪流走步。
l??? 有一個(gè)終止?fàn)顟B(tài),到達(dá)終止?fàn)顟B(tài)后游戲即告終止。
l??? 游戲可以在有限步內(nèi)終止。
P狀態(tài)和N狀態(tài)
就像第一個(gè)游戲一樣,狀態(tài)0,4,8,……是剛才走步的人的必勝狀態(tài),我們稱之為P狀態(tài);而1,2,3,5,6,7,……都是下一個(gè)走步的人的必勝狀態(tài),我們稱之為N狀態(tài)。
我們可以從終止?fàn)顟B(tài)出發(fā),推出每一個(gè)狀態(tài),指出它是P狀態(tài)還是N狀態(tài)。就拿第一個(gè)游戲舉例:
步驟一 將所有終止?fàn)顟B(tài)設(shè)為P狀態(tài)。
步驟二 將所有一步之內(nèi)可以到達(dá)一個(gè)P狀態(tài)的狀態(tài)設(shè)為N狀態(tài)。
步驟三 如果一個(gè)狀態(tài),不管怎么走都只能走到N狀態(tài),那么就將這個(gè)狀態(tài)設(shè)為P狀態(tài)。
步驟四 返回步驟二。
如果能夠走到P狀態(tài),就能獲勝。因?yàn)榘舱丈厦娴亩x,對手不管如何選擇,只可能走到N狀態(tài)。接下來總存在一個(gè)P狀態(tài)你可以走到。這樣一直走到終止?fàn)顟B(tài),你獲勝。當(dāng)然這里所說得都是指對于最后走步的人獲勝的游戲。
我們嚴(yán)格的來定義P狀態(tài)和N狀態(tài)
l??? 所有的終止?fàn)顟B(tài)都是P狀態(tài);
l??? 對于任何的N狀態(tài),肯定存在一種方式可以一步轉(zhuǎn)到一個(gè)P狀態(tài);
l??? 對于任何的P狀態(tài),不管怎么走步,都只能轉(zhuǎn)到N狀態(tài)。
而對于最后走步的人失敗的游戲,只要將所有終止?fàn)顟B(tài)改成N狀態(tài),然后開始倒推就可以了。當(dāng)然,必勝狀態(tài)是N狀態(tài)。也就是說,如果想勝利,就希望面對N狀態(tài),轉(zhuǎn)移到P狀態(tài)。
現(xiàn)在對游戲1略微擴(kuò)展一下。
有一個(gè)決策集S,S中的元素是正整數(shù)。游戲的規(guī)則大致與游戲1一樣,只是現(xiàn)在每次可以取的石子數(shù)必須是S中的元素。如果S={1,2,3},那么就是游戲1。
大家分析一下,當(dāng)S={1,3,4}的時(shí)候,哪些狀態(tài)是P狀態(tài),哪些是N狀態(tài)。
我們發(fā)現(xiàn)P狀態(tài)是{0,2,7,9,14,16,……},N狀態(tài)是{1,3,4,5,6,8,10,……}。
規(guī)律是如果n除以7的余數(shù)是0或2,那么狀態(tài)n就是P狀態(tài),否則就是N狀態(tài)。
如果游戲開始時(shí),石子總數(shù)是100,那么這是一個(gè)P狀態(tài),也就是說后走的人有必勝策略。
游戲2 Nim游戲
有三堆石子,分別含有x1,x2和x3顆石子。兩人輪流取石子,每次可以選擇一堆,從這堆里取走任意多顆石子,但不能不取。取走最后一顆石子的人獲勝。
我們用三元組來表示狀態(tài),很明顯(0, 0, 0)是唯一的終止?fàn)顟B(tài),是P狀態(tài)。
先考慮只剩一堆有石子的情況(0, 0, x),很明顯這是,這些狀態(tài)都是N狀態(tài)。
剩兩堆的情況,如果兩堆的石子數(shù)相等(0, x, x),那么這些都是P狀態(tài)。因?yàn)橄乱淮巫卟降娜艘欢〞?huì)使得兩堆石子不相等,再下一次可以使得兩堆的石子數(shù)回到相等的狀態(tài),包括終止?fàn)顟B(tài)。如果兩堆的石子數(shù)不相等,那么就是N狀態(tài)。
三堆都非空的情況就復(fù)雜得多。我們可以得到(1, 1, 1)、(1,1, 2)、(1, 1, 3)和(1, 2, 2)都是N狀態(tài),因?yàn)樗鼈兛梢赞D(zhuǎn)變成(0, 1, 1)或(0, 2, 2),它們都是P狀態(tài)。(1,2, 3)是P狀態(tài),因?yàn)椴还茉趺催x擇,下一次一定變到N狀態(tài)。
“Nim和”就是兩個(gè)數(shù)二進(jìn)制表示的不進(jìn)位加法,也就是兩個(gè)整數(shù)進(jìn)行xor位運(yùn)算。
定義:兩個(gè)數(shù)(xm…x0)2和(ym…y0)2,是(zm…z0)2,其中zi=(xi+yi) mod 2,0<=i<=m。
例如,22和51的Nim和是37:
整數(shù)關(guān)于Nim和(以后用“+”表示)滿足交換律和結(jié)合律。有單位元0,因?yàn)?+x=x。任何兩個(gè)相等的數(shù)之和是0,即x+x=0。有削去律,即如果x+y=x+z,那么y=z。因?yàn)?#xff0c;如果x+y=x+z,兩邊都加上x,得到x+x+y=x+x+z,即y=z。
定理1:Nim游戲的一個(gè)狀態(tài)(x1, x2, x3) 是P狀態(tài),當(dāng)且僅當(dāng)x1+x2+x3=0。
考慮狀態(tài)(13, 12, 8)。Nim和是9,不等于0,所以這是一個(gè)N狀態(tài)。
那么接下來應(yīng)該怎么走,才能走到一個(gè)P狀態(tài)呢?你可以從第一堆中取走9顆石子。
或者你也可以從第二堆中取走7顆石子,等等。
如果石子的堆數(shù)大于3,只要堆數(shù)是有限的,上面的定理仍然成立。即如果有n堆石子,狀態(tài)(x1, x2, …, xn)是P狀態(tài)的充要條件是x1+x2+…+xn=0。下面就來證明。
我們用ρ表示所有Nim和為零的狀態(tài)組成的集合;用п表示ρ的補(bǔ)集,即所有Nim和為正整數(shù)的狀態(tài)組成的集合。讓我們逐一檢驗(yàn)P狀態(tài)和N狀態(tài)的定義。
l??? 所有的終止?fàn)顟B(tài)都在ρ中。由于終止?fàn)顟B(tài)只有一個(gè)(0, 0, …, 0),0+0+…+0=0。
l??? 所有屬于п的狀態(tài),一步之內(nèi)一定可以走到ρ中的狀態(tài)。找出Nim和最左端為1的那一列,然后任意選擇一個(gè)這一列是1的堆,從這堆中取走若干顆石子,使得Nim和為0。這總是可以做到的,因?yàn)閷⒛且涣械?變成0,而它左邊的列不用修改,這個(gè)數(shù)就肯定變小了。對于其他Nim和是1的列,只要將這個(gè)數(shù)相對列的0改成1,1改成0就可以了。
l??? 所有屬于ρ的狀態(tài),一定轉(zhuǎn)變到п中的狀態(tài)。任意一個(gè)P狀態(tài)(x1,x2, …, xn),不妨假設(shè)從第一堆中取出若干顆石子。如果存在x1’<x1,而(x1’, x2, …, xn)也是P狀態(tài)。那么x1+x2+…+xn=0=x1’+x2+…+xn,根據(jù)前面講的削去律,x1’=x1,與假設(shè)x1’<x1矛盾。所以(x1’, x2, …, xn)一定是N狀態(tài),屬于п。
通過上面的證明,你能得到從一個(gè)N狀態(tài)走到P狀態(tài)的方案數(shù)嗎?而且這個(gè)數(shù)是奇數(shù)。
那么,對于最后走步的人失敗的Nim游戲,又怎么辦呢?通常情況下,這類游戲比最后走步的人獲勝的游戲難得多。但Nim游戲是個(gè)例外。我們來分析一下。
P狀態(tài)和N狀態(tài)的定義不變,如果初始狀態(tài)是N狀態(tài),先走者有必勝策略。當(dāng)超過1顆石子的堆數(shù)大于1的時(shí)候,按照前面所講的方法走。直到超過1顆石子的堆數(shù)等于1,這時(shí)將這堆石子全部取掉或剩1顆,保證非空(剩下1顆石子)的堆數(shù)為奇數(shù)。如果初始狀態(tài)是N狀態(tài),按照策略,先走者不可能將“超過1顆石子的堆數(shù)等于1”的狀態(tài)留給對方,因?yàn)檫@樣的狀態(tài)不可能是P狀態(tài)。而且對方不可能在一步之內(nèi)從“超過1顆石子的堆數(shù)大于1”的狀態(tài)變到“超過1顆石子的堆數(shù)小于1”的狀態(tài)。
圖游戲
現(xiàn)在我們使用有向圖來描述一個(gè)游戲,所有的狀態(tài)用頂點(diǎn)表示,所有合法的移動(dòng)用有向邊表示。接下來我們會(huì)給出Sprague-Grundy函數(shù)(簡稱SG函數(shù)),它比起P狀態(tài)和N狀態(tài),能夠提供更多的信息。
定義:用(X, F)來表示有向圖G。X是頂點(diǎn)集,F是后繼函數(shù)。設(shè)x是一個(gè)頂點(diǎn),F(x)是一個(gè)集合,包含于X,任意一個(gè)元素y屬于F(x),表示從x出發(fā)到y(tǒng)有一條邊。F(x)就是x的后繼集合,也可看成從x出發(fā)的決策集。如果F(x)是空集,那么就表示x是終止?fàn)顟B(tài)。
圖游戲:一個(gè)兩人游戲,在一個(gè)圖G(X, F)上玩,指明一個(gè)頂點(diǎn)x0并按照下列的規(guī)則:
l??? A先走,從x0開始;
l??? 兩人輪流走步;
l??? 從頂點(diǎn)x出發(fā),只能走到頂點(diǎn)y,y屬于F(x);
l??? 遇到終止?fàn)顟B(tài),即不能走步,此人輸。
對于一個(gè)圖,如果不管x0是哪個(gè)點(diǎn),總存在一個(gè)n,使得從x0出發(fā)的任意一條路經(jīng)的長度都不超過n,那么這個(gè)圖就被稱為是“遞增有界”的。接下來主要討論遞增有界的圖游戲。
拿游戲1來舉例,設(shè)有n顆石子。頂點(diǎn)集X={0, 1, 2, …, n},F(0)是空集,F(1)={0},F(2)={0, 1},F(k)={k-3, k-2, k-1},3<=k<=n。下圖是n=10的情況。
SG函數(shù)
定義:
對于一個(gè)遞增有界的圖G(X, F)來說,SG函數(shù)g,是定義在X上的函數(shù),函數(shù)值是非負(fù)整數(shù),使得
用語言來描述就是:g(x)的值等于所有x的后繼的SG函數(shù)中沒有出現(xiàn)的最小非負(fù)整數(shù)。
對于遞增有界的圖,SG函數(shù)是唯一的、有界的。
所有的終止?fàn)顟B(tài)x,因?yàn)镕(x)是空集,所以g(x)=0。
給出下圖的SG函數(shù)。
例1
給出游戲1的SG函數(shù),看看有什么規(guī)律,與P狀態(tài)和N狀態(tài)有什么關(guān)系。
x??? 0??? 1??? 2???3??? 4??? 5??? 6???7??? 8??? 9???10??? 11??? …
g(x)??? 0??? 1???2??? 3??? 0??? 1???2??? 3??? 0??? 1???2??? 3??? …
例2
有一堆石子,設(shè)當(dāng)前剩下n顆石子,這一步至少要取走n/2取上界顆。唯一的終止?fàn)顟B(tài)是剩0顆石子。給出SG函數(shù),看看有什么規(guī)律。
x??? 0??? 1??? 2???3??? 4??? 5??? 6???7??? 8??? 9??? 10???11??? 12??? …
g(x)??? 0??? 1???2??? 2??? 3??? 3???3??? 3??? 4??? 4???4??? 4??? 4??? …
根據(jù)例1的結(jié)果,我們猜測SG函數(shù)與P狀態(tài)和N狀態(tài)是有關(guān)的。如果g(x)=0,那么x就是P狀態(tài),否則x就是N狀態(tài)。證明是很顯然的,我們只要根據(jù)兩者的定義,考慮以下三點(diǎn):
l??? 如果x是終止?fàn)顟B(tài),那么g(x)=0。
l??? 一個(gè)狀態(tài)x,如果g(x)≠0,那么一定存在一個(gè)x的后繼y,使得g(y)=0。
l??? 一個(gè)狀態(tài)x,如果g(x)=0,那么所有x的后繼y,都有g(shù)(y)≠0。
當(dāng)然,SG函數(shù)還包含了其他的信息,這些信息在以后會(huì)用到。
多個(gè)組合游戲的并
給定若干個(gè)組合游戲,可以按照下面的規(guī)則將它們并成一個(gè)新的游戲。
l??? 對每個(gè)游戲給定初始狀態(tài)。
l??? 兩人輪流走步,從A開始。
l??? 每一輪,選擇一個(gè)未到達(dá)終止?fàn)顟B(tài)的游戲,在這個(gè)游戲中按照規(guī)則走一步,其他游戲的狀態(tài)不變。
l??? 最后一個(gè)走步者獲勝,即走完之后所有游戲都到達(dá)終止?fàn)顟B(tài)。
我們稱這個(gè)新的游戲?yàn)椤岸鄠€(gè)組合游戲的并”。我們要來看如何用每一個(gè)游戲的SG函數(shù)來求這個(gè)新的組合游戲的SG函數(shù)。
n個(gè)圖游戲的并
定義:有n個(gè)遞增有界的圖游戲G1(X1, F1),……,Gn(Xn, Fn)。把它們合并成一個(gè)新的游戲G(X, F),記為G=G1+G2+…+Gn。X是所有游戲頂點(diǎn)集的笛卡爾積,即X=X1*X2*…*Xn。也就是說,我們用n元組(x1, x2, …, xn)來表示G中的頂點(diǎn)x,其中xi屬于Xi,對于所有的i。x的后繼F(x)可以定義成:
這樣定義的新的游戲G,一定也是遞增有界的。把每個(gè)游戲的界相加,就得到了新游戲的界。
正如Nim游戲那樣,如果堆數(shù)是1,那么非常簡單;如果堆數(shù)是2,也很容易分析;但堆數(shù)如果大于2,就不是很明顯了。所以即使每個(gè)圖游戲都是很平凡的,n個(gè)圖游戲的并也可能相當(dāng)復(fù)雜。
下面介紹的SG定理可以看成是定理1的一般化。
定理2
設(shè)G=G1+G2+…+Gn,Gi的SG函數(shù)是gi,i=1, 2, …, n。那么G的SG函數(shù)g(x1, x2, …,xn)=g1(x1)+g2(x2)+…+gn(xn),加法表示Nim和,即不進(jìn)位的二進(jìn)制加法。
證明:
令x(x1, x2, …, xn)是X中任意一點(diǎn),b= g1(x1)+g2(x2)+…+gn(xn)。
根據(jù)SG函數(shù)的定義,我們要說明兩點(diǎn):
(1)、對于任意的非負(fù)整數(shù)a(a<b),一定存在一個(gè)x的后繼y,使得g(y)=a。
(2)、x的任意一個(gè)后繼y,都有g(shù)(y)1b。
首先來說明(1)。設(shè)d=a+b(nim和),d的二進(jìn)制表示有k位,則2k-1<=d<2k。d的第k位是1而且a<b,所以a的第k位是0,b的第k位是1。因?yàn)閎=g1(x1)+g2(x2)+…+gn(xn),所以至少存在一個(gè)分量的第k位是1,不妨設(shè)它就是g1(x1)。那么,就有d+g1(x1)<g1(x1),也就存在從x1到x1’的一次走步,使得g1(x1’)=d+g1(x1)。那么g1(x1’)+g2(x2)+…+gn(xn)=d+g1(x1)+g2(x2)+…+gn(xn)= d+b=a。
再說明(2)。反證法。不失一般性,假設(shè)后繼的走步是從x1到x1’,又有g(shù)1(x1’)+g2(x2)+…+gn(xn)=g1(x1)+g2(x2)+…+gn(xn)。根據(jù)消去率,g1(x1’)=g1(x1),這與SG函數(shù)的定義不符,假設(shè)不成立。
例3、你每次可以從一堆石子中取走{1, 2, …, m}顆。對于1堆的問題,SG函數(shù)gm(x)=xmod (m+1)。如果考慮3個(gè)這樣的游戲的并,第一個(gè)游戲m=3,有9顆石子;第二個(gè)游戲m=5,有10顆石子;第三個(gè)游戲m=7,有14顆石子。g(9,10,14)=g3(9)+g5(10)+g7(14)=1+4+6=3,是一個(gè)N狀態(tài)。要取勝的話,下一次可以選擇第三個(gè)游戲,取走1顆石子,使得g7(13)=5。那么,還有別的取法嗎?
var
? n,m,p,t,i:longint;
begin
? readln(n);
? t:=0;
? for i:=1 to n do begin
??? readln(m,p);
??? t:=t xor (p mod (m+1));
??? end;
? if t=0 then writeln('P') else writeln('N');
end.
取走-分割游戲
這種游戲允許取走某些東西,然后將原來的一個(gè)游戲分成若干個(gè)相同的游戲。
例1、Lasker’s Nim游戲:每一輪允許兩種操作之一。(1)從一堆石子中取走任意多個(gè)(2)將一堆數(shù)量不少于2的石子分成都不為空的兩堆。
分析:
很明顯,g(0)=0,g(1)=1。狀態(tài)2的后繼有0,1和(1,1),它們的SG函數(shù)值分別是0,1和0,所以g(2)=2。狀態(tài)3的后繼有0,1,2和(1,2),它們的SG函數(shù)值分別是0,1,2和3,所以g(3)=4。狀態(tài)4的后繼有0,1,2,3,(1,3)和(2,2),它們的SG函數(shù)值分別是0,1,2,4,5和0,所以g(4)=3。在推一些,我們得到:
我們推測:對于所有的k>=0,有g(shù)(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3。
請自行證明。
假設(shè)游戲初始時(shí)有3堆,分別有2、5和7顆石子。三堆的SG函數(shù)值分別是2、5和8,它們的Nim和等于15。所以要走到P狀態(tài),就要使得第三堆的SG值變成7,可以將第三堆分成按1和6分成兩堆。
PAS
2人玩的游戲,一個(gè)p*1的棋盤和紅、綠、藍(lán)三種棋子,棋子的大小分別是c*1、z*1和n*1,每種顏色的棋子個(gè)數(shù)無限。兩人輪流擺放棋子,規(guī)則是:
棋子不得超出棋盤范圍;
棋子不能有任何部分重疊;
如果哪個(gè)人沒有棋子可放,即算輸。
判斷先手是否有必勝策略。
輸入:
第一行是正整數(shù)c、z和n,都不超過1000。
第二行是m,表示棋盤種類。接下來的m行,每行一個(gè)正整數(shù)p。m和p都不超過1000。
輸出:
對于每種棋盤輸出一行,如果先手必勝輸出1,否則輸出2。
樣例
輸入
1 5 1
3?
1?
5?
6
輸出
1
1
2
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">varc:array[1..3] of longint;g,q:array[0..1000] of longint;b:array[0..1000] of boolean;m,maxq,i,j,k:longint;beginassign(input,'pas.in'); reset(input);assign(output,'pas.out'); rewrite(output);readln(c[1],c[2],c[3]);readln(m);maxq:=0;for i:=1 to m do beginread(q[i]);if q[i]>maxq then maxq:=q[i];end;g[0]:=0;for i:=1 to maxq do beginfillchar(b,sizeof(b),false);for j:=1 to 3 dofor k:=0 to i-c[j] do b[g[k] xorg[i-c[j]-k]]:=true;j:=0;while b[j] do inc(j);g[i]:=j;end;for i:=1 to m doif g[q[i]]=0 then writeln(2) else writeln(1);close(input); close(output); end.</span></span>
尋找必?cái)B(tài)——一類博弈問題的快速解法
博弈是信息學(xué)和數(shù)學(xué)試題中常會(huì)出現(xiàn)的一種類型,算法靈活多變是其最大特點(diǎn),而其中有一類試題更是完全無法用常見的博弈樹來進(jìn)行解答。尋找必?cái)B(tài)即為針對此類試題給出一種解題思路。
??????????????????此類問題一般有如下特點(diǎn):
??????????????????1、博弈模型為兩人輪流決策的非合作博弈。即兩人輪流進(jìn)行決策,并且兩人都使用最優(yōu)策略來獲取勝利。
??????????????????2、博弈是有限的。即無論兩人怎樣決策,都會(huì)在有限步后決出勝負(fù)。
??????????????????3、公平博弈。即兩人進(jìn)行決策所遵循的規(guī)則相同。
??????????????????以下題目都屬于這一類:
??????????????????POJ1740 A New Stone Game
??????????????????MIPT100 Nim Game -- who is the winner??
??????????????????POJ1704 Georgia and Bob
??????????????????POJ1067 取石子游戲
??????????????????本著先理論后實(shí)踐的原則,本文先對“尋找必?cái)B(tài)”做出理論上的解釋:
???????????????????
?????????????????要理解這種思想,首先要明白什么叫必?cái)B(tài)。說簡單點(diǎn),必?cái)B(tài)就是“在對方使用最優(yōu)策略時(shí),無論做出什么決策都會(huì)導(dǎo)致失敗的局面”。其他的局面稱為勝態(tài),值得注意的是在勝態(tài)下做出錯(cuò)誤的決策也有可能導(dǎo)致失敗。此類博弈問題的精髓就是讓對手永遠(yuǎn)面對必?cái)B(tài)。
??????????????????必?cái)B(tài)和勝態(tài)有著如下性質(zhì):
??????????????????1、若面臨末狀態(tài)者為獲勝則末狀態(tài)為勝態(tài)否則末狀態(tài)為必?cái)B(tài)。
??????????????????2、一個(gè)局面是勝態(tài)的充要條件是該局面進(jìn)行某種決策后會(huì)成為必?cái)B(tài)。
??????????????????3、一個(gè)局面是必?cái)B(tài)的充要條件是該局面無論進(jìn)行何種決策均會(huì)成為勝態(tài)
???????????????????
????????????? 這三條性質(zhì)正是博弈樹的原理,但博弈樹是通過計(jì)算每一個(gè)局面是勝態(tài)還是必?cái)B(tài)來解題,這樣在局面數(shù)很多的情況下是很難做到的,此時(shí),我們可以利用人腦的推演歸納能力找到必?cái)B(tài)的共性,就可以比較好的解決此類問題了。
??????????????????下面就通過實(shí)際題目來做一些分析:
??????????????????例1 POJ1740 A New Stone Game
???????????????????
????????????? 題目大意是:有N堆石子,兩人輪流進(jìn)行操作,每一次為“操作者指定一堆石子,先從中扔掉一部分(至少一顆,可以全部扔掉),然后可以將該堆剩下的石子中的任意多顆任意移到其他未取完的堆中”,操作者無法完成操作時(shí)為負(fù)。
??????????????????分析:
??????????????????只有一堆時(shí)先手必勝。
??????????????????有兩堆時(shí)若兩堆相等則后手只用和先手一樣決策即可保證勝利,后手必勝。若不同則先手可以使其變成相等的兩堆,先手必勝。
??????????????????有三堆時(shí)先手只用一次決策即可將其變成兩堆相等的局面,先手必勝。
??????????????????有四堆時(shí)由于三堆必勝,無論先手后手都想逼對方取完其中一堆,而只有在四堆都為一顆時(shí)才會(huì)有人取完其中一堆,聯(lián)系前面的結(jié)論可以發(fā)現(xiàn),只有當(dāng)四堆可以分成兩兩相等的兩對時(shí)先手才會(huì)失敗。
???????????????????
????????????? 分析到這里,題目好像已經(jīng)有了一些眉目了,憑借歸納猜想,我們猜測必?cái)B(tài)的條件為“堆數(shù)為偶數(shù)(不妨設(shè)為2N),并且可以分為兩兩相等的N對”。
??????????????????下面只需證明一下這個(gè)猜想。其實(shí)證明這樣的猜想很簡單,只用檢驗(yàn)是否滿足必?cái)B(tài)的三條性質(zhì)即可。
??????????????????首先,末狀態(tài)為必?cái)B(tài),第一條性質(zhì)符合。
??????????????????其次,可以證明任何一個(gè)勝態(tài)都有策略變成必?cái)B(tài)(分奇數(shù)堆和偶數(shù)堆兩種情況討論)。
??????????????????最后,證明任何一個(gè)必?cái)B(tài)都無法變成另一個(gè)必?cái)B(tài)(比較簡單)。
??????????????????由于篇幅關(guān)系,這里就不具體證明了,如果有興趣可以自己試試∶P
????????????? 接下來的程序就相當(dāng)簡單了,只用判斷一下即可。
??????????????????有些題則比這一題的條件隱蔽許多,例如:
??????????????????例2 MIPT100 Nim Game -- who is the winner??
???????????????????題目大意是:有N堆石子,兩人輪流取,每次可以從任意一堆中取任意多顆(但至少一顆),誰先取完誰勝。
???????????????????分析:
???????????????????還是用按照“手推小數(shù)據(jù)=〉猜想=〉證明”的模式。
???????????????????一堆時(shí)先手必勝。
???????????????????兩堆時(shí)若兩堆相等則先手必?cái)?#xff0c;否則先手勝。
???????????????????三堆的情況就有點(diǎn)復(fù)雜了,此時(shí),我們只好借助博弈樹來在小范圍內(nèi)求解,從這些解中我們可以看出,對于由兩個(gè)不同數(shù)字構(gòu)成的兩元組,都有且僅有一個(gè)三元必?cái)B(tài)包含它,這又意味著什么呢?我們定義一個(gè)函數(shù)F(a,b),表示“包含a,b的三元必?cái)B(tài)中的第三數(shù)”,則有
???????????????????F(1,2)=3,F(1,3)=2,F(1,4)=5,F(1,5)=4,F(1,6)=7,F(1,7)=6...
???????????????????F(2,1)=3,F(2,3)=1,F(2,4)=6,F(2,5)=7,F(2,6)=4,F(2,7)=5...
???????????????????F(3,1)=2,F(3,2)=1,F(3,4)=7,F(3,5)=6,F(3,6)=5,F(3,7)=4...
????????????????????
?????????????..................................................................................
????????????????
????????????????????
?????????????..................................................................................
????????????????
???????????????敏銳的選手馬上會(huì)發(fā)現(xiàn),這個(gè)F(a,b)不就是a?XOR(異或) b的結(jié)果么?做到這里,答案就在眼前了,‘XOR‘運(yùn)算恐怕就是本題的關(guān)鍵。
????????????????????
??????????????繼續(xù)求出一些四元必?cái)B(tài),這個(gè)性質(zhì)仍然符合,于是我們猜想,必?cái)B(tài)即為“所有堆的石子數(shù)XOR運(yùn)算后結(jié)果為零的局面”。這也解釋了為什么一堆石子必勝,兩堆石子僅在相等時(shí)必?cái) ?br /> ???????????????????接下來又是證明:
???????????????????依舊判斷是否符合三條性質(zhì)。
???????????????????第一條第三條顯然滿足,關(guān)鍵就是第二條。
????????????????????
????????????????必勝態(tài)下,設(shè)所有堆石子XOR后結(jié)果為N,將其寫成二進(jìn)制,則至少有一堆石子寫成二進(jìn)制后在N的最高位上為一,則可以證明從這堆石子中取可以變成必?cái)B(tài),這里還是留給有興趣的選手:)
???????????????????這一題就明顯沒有上一題輕松了,而且這是個(gè)經(jīng)典問題,結(jié)論可以記下來。下面這個(gè)例子就是例2的強(qiáng)化版:
???????????????????例3????POJ1704 Georgia and Bob
????????????????????
??????????????????題目大意是:一個(gè)1*M的棋盤上有N個(gè)棋子,初始位置一定,兩人輪流操作,每次移動(dòng)一枚棋子,要求只能向左移且至少移動(dòng)一格,而且不能到達(dá)或經(jīng)過以前有棋子的格子,誰無法移動(dòng)棋子就算輸。
???????????????????分析:
???????????????????乍一看這一題棋子移動(dòng)還要受其他棋子的限制,好像無法求出通解,但仔細(xì)分析會(huì)發(fā)現(xiàn)別有洞天。
????????????????????
???????????????????一個(gè)棋子每一次向左移的最大步數(shù)是固定的,而且隨著移動(dòng)減少,不是和取石子很像么?那么和取石子的區(qū)別在哪呢?就在于每一次移動(dòng)時(shí)都會(huì)讓右邊相鄰的那顆棋子移動(dòng)空間變大,這樣就和取石子只減不增有所不同了,我們應(yīng)該怎樣解決這個(gè)問題呢?
???????????????????我們并不放棄將其與我們熟悉的取石子對應(yīng),但我們將策略做小小的變動(dòng):
????????????????????
?????????????????將棋子從右端向左端每相鄰兩個(gè)分為一對,如果只剩一個(gè)就將棋盤左端加一格放一顆棋子與之配對,這樣配對后好像和以前沒有什么區(qū)別,但決策時(shí)就方便多了,因?yàn)槲覀兇罂刹槐仃P(guān)心組與組之間的距離,當(dāng)對手移動(dòng)一組中靠左邊的棋子時(shí),我們只需將靠右的那一顆移動(dòng)相同步數(shù)即可!同時(shí)我們把每一組兩顆棋子的距離視作一堆石子,在對手移動(dòng)兩顆棋子中靠右的那一顆時(shí),我們就和他玩取石子游戲,這樣就把本題與取石子對應(yīng)上了。
?????????????????本例說明有許多模型看似復(fù)雜,但經(jīng)過一些巧妙的變換,便可以轉(zhuǎn)化成一些我們熟悉的模型,同時(shí)也充分體現(xiàn)了博弈的靈活。
?????????????????如果說前面的例子是介紹這種思想的運(yùn)用的話,下面的方法就是講這種思路的優(yōu)越性了,因?yàn)檫@一題并不是走的“手推小數(shù)據(jù)=〉猜想=〉證明”的老路,而是直接利用性質(zhì)推導(dǎo)必?cái)l件。
???????????????????
???????????????????例4?
?????????????url=http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=4163]POJ1067
????????????? 取石子游戲[/URL]
???????????????????題目大意是:......題目本來就是中文的-_-b。
???????????????????分析:
??????????????????剛拿到這一題時(shí),我不加思索的猜想必?cái)B(tài)為“兩堆石子的數(shù)目是2:1”,用性質(zhì)判定:第一條顯然符合,第二條分情況討論每一種“勝態(tài)”都有一種固定的方法變成“必?cái)B(tài)”,再看第三條,設(shè)第一堆有N顆,第二堆有2*N顆,則無論怎樣拿都無法讓第二堆保持為第一堆的兩倍。證畢。
???????????????本以為此題就這么簡簡單單完了,但是我突然發(fā)現(xiàn),當(dāng)?shù)谝欢?顆,第二堆4顆時(shí),從第二堆中取出3顆石子的話第二堆的確無法保持為第一堆的兩倍,但第一堆會(huì)變成第二堆的兩倍,基于此,整個(gè)猜想被徹底推翻。
??????????????于是我反轉(zhuǎn)思路,干脆從性質(zhì)入手。
??????????????我們令必?cái)《M為(a,b)形式,并令a<b。
??????????????根據(jù)性質(zhì)三,有這樣兩個(gè)推論:
????????????????????
??????????????推論一:對于任意兩個(gè)的必?cái)《M(a1,b1),(a2,b2),有a1<>a2,b1<>b2,a1<>b2,a2<>b1。
??????????????推論二:對于任意兩個(gè)的必?cái)《M(a1,b1),(a2,b2),有b1-a1<>b2-a2。
????????????????????
????????????? 利用性質(zhì)和該推論,我們證明如下結(jié)論:“將必?cái)《M按首元為關(guān)鍵字排序,每個(gè)必?cái)《M中首元為未在前面的必?cái)《M中出現(xiàn)的最小正整數(shù),并且第N組中兩個(gè)數(shù)差為N”。
???????????????????利用數(shù)學(xué)歸納法證明:
???????????????????第一組為(1,2),滿足題意。
???????????????????若前N組滿足題意,則有:
???????????????????設(shè)為在前N組中出現(xiàn)的最小正整數(shù)為M,則對于二元組(M,M+N+1)有:?
????????????????????
???????????? 如果從數(shù)量為M的堆中取了石子,不妨設(shè)變成了(K,L),則L-K>N,這樣就有一個(gè)包含K,且不與前面N組任何一組相同的二元組,根據(jù)推論一,這個(gè)二元組一定不是必?cái)《M。
???????????? 如果只從數(shù)量為M+N+1的堆中取,不妨設(shè)剩下K顆,又分三種情況:
????????????????K>M,則N+1>K-M>0,根據(jù)推論二,這個(gè)二元組一定不是必?cái)《M。
????????????????K=M或0,顯然不是必?cái)《M。
????????????????0<K<M,則(K,M)為包含K,且不與前面N組任何一組相同的二元組,根據(jù)推論一,這個(gè)二元組一定不是必?cái)《M。
?????????? 綜上,根據(jù)性質(zhì)三,(M,M+N+1)為必?cái)《M,又根據(jù)排序的法則,(M,M+N+1)一定是數(shù)列的第(N+1)項(xiàng)。證畢。
?????????? 這樣利用性質(zhì)和性質(zhì)得出的推論,此題的必?cái)B(tài)也完美的找出了。
??????????從上面的例子可以看出,利用尋找必?cái)B(tài)的思路解題對猜想和數(shù)學(xué)證明的能力要求很高,對思維的訓(xùn)練有很大好處,同時(shí)編程復(fù)雜度相當(dāng)?shù)?#xff0c;也不失為一種好的解題方法。
?
總結(jié)
- 上一篇: Python爬虫 西刺代理IP的获取
- 下一篇: [转]Xvid参数详解