【轉】博弈-翻硬幣游戲
翻硬幣游戲
一般的翻硬幣游戲的規則是這樣的:
N 枚硬幣排成一排,有的正面朝上,有的反面朝上。我們從左開始對硬幣按1 到N 編號。
第一,游戲者根據某些約束翻硬幣,但他所翻動的硬幣中,最右邊那個硬幣的必須是從正面翻到反面。例如,只能翻3個硬幣的情況,那么第三個硬幣必須是從正面翻到反面。如果局面是正正反,那就不能翻硬幣了,因為第三個是反的。
第二,誰不能翻誰輸。
有這樣的結論:局面的SG 值為局面中每個正面朝上的棋子單一存在時的SG 值的異或和。即一個有k個硬幣朝上,朝上硬幣位置分布在的翻硬幣游戲中,SG值是等於k個獨立的開始時只有一個硬幣朝上的翻硬幣游戲的SG值異或和。比如THHTTH這個游戲中,2號、3號、6號位是朝上的,它等價於TH、TTH、TTTTTH三個游戲和,即sg[THHTTH]=sg[TH]^sg[TTH]^sg[TTTTTH].我們的重點就可以放在單個硬幣朝上時的SG值的求法。
約束條件一:每次只能翻一個硬幣。
一般規則中,所翻硬幣的最右邊必須是從正面翻到反面,因為這題是只能翻一個硬幣,那么這個硬幣就是最右邊的硬幣,所以,每次操作是挑選一個正面的硬幣翻成背面。
對於任意一個正面的硬幣,SG值為1。
有奇數個正面硬幣,局面的SG值==1,先手必勝,有偶數個正面硬幣,局面的SG值==0,先手必敗。
約束條件二:每次能翻轉一個或兩個硬幣。(不用連續)
每個硬幣的SG值為它的編號,初始編號為0,與NIM游戲是一樣的。
如果對於一個局面,把正面硬幣的SG值異或起來不等於0,既a1^a2^a3^…^an==x,對於an來說一定有an'=an^x<an。
如果an'==0,意思就是說,把an這個值從式子中去掉就可以了。對應游戲,就是把編號為an的正面硬幣翻成背面就可以了。因為an^x==0,而a1^a2^a3^…^an==x,即an^a1^a2^a3^…^an==0,即a1^a2^a3^…^an-1==0,只要在原來的x里面去掉an就可以了。
如果an'!=0,意思就是說,把an這個值從式子中去掉后再在式子中加上an',an'<an。對應游戲,去掉an就是把編號為an的正面硬幣翻成背面,加上an',如果編號為an'的硬幣是正面,我們就把它翻成背面,是背面就翻成正面,總之,就是翻轉編號為an'的硬幣。因為an^x!=0,所以an^a1^a2^a3^…^an!=0,即a1^a2^a3^…^an-1!=0,而這里的
an'=a1^a2^a3^…^an-1,所以在x中去掉an后,要對an'進行異或,也就是翻轉,正轉反,反轉正。
約束條件三:每次必須連續翻轉k個硬幣。
我們以k==3為例。
我們計算的是個數為N的硬幣中,其中最后一個硬幣為正面朝上,的sg值。
當N==1時,硬幣為:正,先手必輸,所以sg[1]=0。
當N==2時,硬幣為:反正,先手必輸,所以sg[2]=0。
當N==3時,硬幣為:反反正,先手必勝,所以sg[3]=1。
當N==4時,硬幣為:反反反正,先手操作后為:反正正反,子狀態局面的SG=0^1=1,那么sg[4]=0。
當N==5時,硬幣為:反反反反正,先手操作后為:反反正正反,子狀態局面的SG=1^0=1,那么sg[5]=0。
當N==6時,硬幣為:反反反反反正,先手操作后為:反反反正正反,子狀態局面的SG=0^0=0,那么sg[6]=1。
根據觀察,可以知道,從編號為1開始,sg值為:001 001 001 001……
根據觀察,可以知道,sg的形式為000…01 000…01,其中一小段0的個數為k-1。
約束條件4:每次翻動一個硬幣后,必須翻動其左側最近三個硬幣中的一個,即翻動第x個硬幣后,必須選擇x-1,x-2,x-3中的其中一個硬幣進行翻動,除非x是小於等於3的。(Subtraction Games)
當N==1時,硬幣為:正,先手必贏,所以sg[1]=1。
當N==2時,硬幣為:反正,先手必贏,因為先手可以翻成反反或正反,可能性為2,所以sg[2]==2。
當N==3時,硬幣為:反反正,先手操作后可以為:反正
位置x:1 2 3 4 5 6 7 8 9 10 11 12 13 14...
sg[x]: 1 2 3 0 1 2 3 0 1 2 3 0 1 2…
這個與每次最多只能取3個石子的取石子游戲的SG分布一樣,同樣還有相似的這類游戲,約束條件5也是一樣。
約束條件5:每次必須翻動兩個硬幣,而且這兩個硬幣的距離要在可行集S={1,2,3}中,硬幣序號從0開始。(Twins游戲)
當N==1時,硬幣為:正,先手必輸,所以sg[0]=0。
當N==2時,硬幣為:反正,先手必贏,所以sg[1]=1。
當N==3時,硬幣為:反反正,先手必贏,所以sg[2]=2。
當N==4時,硬幣為:反反反正,先手必贏,所以sg[3]=3。
當N==5時,硬幣為:反反反反正,先手必輸,所以sg[4]=0。
位置x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
sg[x]: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2…
約束條件6:每次可以翻動一個、二個或三個硬幣。(Mock Turtles游戲)
初始編號從0開始。
當N==1時,硬幣為:正,先手必勝,所以sg[0]=1.
當N==2時,硬幣為:反正,先手必贏,先手操作后可能為:反反或正反,方案數為2,所以sg[1]=2。
當N==3時,硬幣為:反反正,先手必贏,先手操作后可能為:反反反、反正反、正反正、正正反,方案數為4,所以sg[2]=4。
位置x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
sg[x]: 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28…
看上去sg值為2x或者2x+1。我們稱一個非負整數為odious,當且僅當該數的二進制形式的1出現的次數是奇數,否則稱作evil。所以1,2,4,7是odious因為它們的二進制形式是1,10,100,111.而0,3,5,6是evil,因為它們的二進制形式是0,11,101,110。而上面那個表中,貌似sg值都是odious數。所以當2x為odious時,sg值是2x,當2x是evil時,sg值是2x+1.
這樣怎么證明呢?我們會發現發現,
evil^evil=odious^odious=evil
evil^odious=odious^evil=odious
假設剛才的假說是成立的,我們想證明下一個sg值為下一個odious數。注意到我們總能夠在第x位置翻轉硬幣到達sg為0的情況;通過翻轉第x位置的硬幣和兩個其它硬幣,我們可以移動到所有較小的evil數,因為每個非零的evil數都可以由兩個odious數異或得到;但是我們不能移動到下一個odious數,因為任何兩個odious數的異或都是evil數。
假設在一個Mock Turtles游戲中的首正硬幣位置x1,x2,…,xn是個P局面,即sg[x1]^…^sg[xn]=0.那么無可置疑的是n必定是偶數,因為奇數個odious數的異或是odious數,不可能等於0。而由上面可知sg[x]是2x或者2x+1,sg[x]又是偶數個,那么x1^x2^…^xn=0。相反,如果x1^x2^…^xn=0且n是偶數,那么sg[x1]^…^sg[xn]=0。這個如果不太理解的話,我們可以先這么看下。2x在二進制當中相當於把x全部左移一位,然后補零,比如說2的二進制是10,那么4的二進制就是100。而2x+1在二進制當中相當於把x全部左移一位,然后補1,比如說2的二進制是10,5的二進制是101。現在看下sg[x1]^…^sg[xn]=0,因為sg[x]是2x或者2x+1,所以式子中的2x+1必須是偶數個(因為2x的最后一位都是0,2x+1的最后一位都是1,要最后異或為0,2x+1必須出現偶數次)。實際上的情況可能是這樣的:
MT游戲當中的P局面是擁有偶數堆石子的Nim游戲的P局面。
約束條件7:每次可以連續翻動任意個硬幣,至少翻一個。(Ruler游戲)
初始編號從1開始。
那么這個游戲的SG函數是g(n)=mex{0,g(n-1),g(n-1)^g(n-2),…,g(n-1)^…^g(1)}
根據SG函數可以得到SG值表如下。
位置x:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
g(x): 1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 16…
所以sg值為x的因數當中2的能達到的最大次冪。比如14=2*7,最大1次冪,即2;16=2*2*2*2,最大4次冪,即16。
這個游戲成為尺子游戲是因為SG函數很像尺子上的刻度。
約束條件8:每次必須翻轉4個對稱的硬幣,最左與最右的硬幣都必須是從正翻到反。(開始的時候兩端都是正面)(Grunt游戲)
這是Grundy游戲的變種,初始編號從0開始。
當首正硬幣位置為0,1,2時是terminal局面,即 終結局面,sg值都是0。當首正硬幣位置n大於等於3的時候的局面可以通過翻0,x,n-x,n四個位置得到(其中x<n/2可保證勝利)。
這就像是把一堆石子分成兩堆不同大小石子的游戲,也就是Grundy游戲。
附注: