正文

拿石子遊戲(NIM)

(2007-04-21 09:24:28) 下一個
拿石子遊戲(NIM)

NIM是一種兩人玩的遊戲,規則是這樣的:有三堆石子,每堆分別有三,五,七個。兩人輪流拿,每次拿的個數不限,但隻能從一堆拿。拿最後一個的勝。圍繞著NIM棋有一整套理論。我們從簡單講起。

問題1。有一堆50個石子。每人每次可以拿1到10個,拿最後一個的勝。第一次拿幾個可以保證必勝?

這道題比較簡單。隻要給對方11的倍數就行了。因為 50 = 6 mod 11,第一次應該拿6個。但是從這裏我們可以展開NIM理論。

這種遊戲有下列特征:
1。遊戲由一係列(有限個)不可逆狀態組成。
2。允許走法由狀態決定。
3。到不能繼續時遊戲結束,走最後一步的人勝。

如果對一個狀態必勝策略存在,稱之為勝狀態,否則為負狀態。從勝狀態出發,一步一定可以到達一個負狀態,而從負狀態出發,一步到達不了另一個負狀態,隻能到達勝狀態。對每一種狀態P定義P的NIM值N(P)如下:

1。不能繼續的狀態的NIM值為0。
2。對狀態P,設S為所有從P可以一步到達的狀態的NIM值的集合。則N(P)等於不在S中的非負整數中最小的。

比如說,如果從P出發可以一步到達的狀態的NIM值為0,1,2,5,7,N(P)就為3。容易看出下列定理:

定理1。狀態P是勝狀態的充分必要條件是N(P) > 0。必勝策略是達到NIM值為0的狀態,即負狀態。

我們看看怎樣用定理1來解問題1。根據定義可以算出來正整數n的NIM值等於N(n) = n mod 11。必勝策略是拿走n除以11的餘數。

再看一個例子:

問題2。有充分多的一分,五分,十分,二十五分,五十分,一百分硬幣。二人輪流向一個瓶內投硬幣,每次一枚,先投到20.05元為勝,超過為負。第一次應該投哪一個硬幣?

這個問題相當於有一堆2005個石子,每次可拿一,五,十,二十五,五十,一百個。計算可得前15個NIM值為:1,0,1,0,1,0,1,0,1,2,3,2,3,2,0。15以後為周期性。因為2005 = 10 mod 15,其NIM值為2。必勝策略為投十分,二十五分,或一百分。

有時問題不用理論也能解,例如

問題3。有一塊6X8的矩形巧克力,左下角那一塊壞了。兩人分吃,每次掰掉一條,即剩下的還是矩形。吃最後一塊為負。第一次應該掰多少?

當然是給對方留下正方形,即第一次掰2X6。如果用NIM值來算。下麵是每個矩形的NIM值:

5,4,7,6,1,0,3,2
4,5,6,7,0,1,2,3
3,2,1,0,7,6,5,4
2,3,0,1,6,7,4,5
1,0,3,2,5,4,7,6
0,1,2,3,4,5,6,7

還有時即使用了理論也不好解,例如

問題4。(和上一題差不多。)有一塊6X8的矩形巧克力,左下角那一塊壞了。兩人分吃,每次掰時,先選定一塊,然後把這塊及其上麵和右麵的都掰掉。(剩下的是鋸齒形。)吃最後一塊為負。第一次應該掰多少?

這一題的NIM值就很難算了,要編一個程序才行。下麵是矩形的NIM值。(還不包括鋸齒形。)

5,8,12,16,21,13,28,32
4,7,11,13, 6,21,23,22
3,5, 9, 6,13,16,19,12
2,4, 5, 9,11,12,13,16
1,2, 4, 5, 7, 8,10,11
0,1, 2, 3, 4, 5, 6, 7

從這裏可以看出問題4的必勝策略存在,但看不出是什麽。再繼續計算鋸齒形的NIM值才能知道唯一必勝策略是掰掉4X5的一塊。

有意思的是在這個問題中大於1X1的矩形的NIM值都不是0。這是可以證明的:設P為一個矩形狀態,P’是P掰掉右上角的一小塊後剩下的鋸齒形狀態。注意所有從P’能一步達到的狀態,都能從P一步達到。因此不論N(P’)是否為0,N(P)都不為0。這樣我們就得到了一個非構造性的證明:任何大於1X1的矩形狀態都是勝狀態。

下麵一道題也是非構造性的。

問題5。一張紙上寫著從1到N的自然數。兩人輪流從紙上擦去一個數。這個數的所有因子自動消失。比如:劃掉數8, 則紙上 8 4 2 1自動消失。劃掉最後一個數的人獲勝。問:當N=3000 的時候,最後誰贏?

第一個人一定能贏。假設他不能贏,則不管他劃幾,第二個人都能贏。第一個人就劃1,設第二個人劃k能贏。但第一個人可以直接劃k,就贏了。

我們注意到,在上麵的理論中,NIM值隻是0才有用。隻要算到1就行了,大於1的可以都算成1。還有另一個問題就是NIM值太難算。下麵我們對一大類遊戲來簡化NIM值的計算,算法中就要用到大於1的NIM值了。

這類遊戲可以分解為幾個獨立子遊戲,每個子遊戲滿足前麵的條件,子遊戲的規則可以相同也可以不同,每人每次隻能在其中一個子遊戲中走一步。這類遊戲的狀態也是由子狀態組成的。

定理2。整個狀態的NIM值等於對所有子狀態的NIM值進行二進製的不進位加法,即邏輯中的XOR運算。

例如,如果三個子狀態的NIM值分別為3,5,7,則整個遊戲的NIM值為 (11) XOR (101) XOR (111) = 1。我們用圓括號(x)來表示正整數x的二進製形式,如7 = (111)。

定理2的證明不難,隻是用到NIM值的定義和二進位數基本運算。但是卻十分有用。下麵看一看怎樣用它計算NIM值及必勝策略。

在NIM遊戲裏,初始狀態「3,5,7」的必勝策略是什麽?狀態「3,5,8」的必勝策略又是什麽?狀態「3,4,5,6,7」呢?

前麵已經算過這個初始狀態的NIM值N「3,5,7」為1,必勝策略就是從任何一堆拿一個就行了。

一般來說,先把NIM值表成二進位數,找一個在NIM值的最高位為1的子狀態,然後比較整個狀態和子狀態的NIM值。所有整個狀態為1的位上,子狀態是1就改成0,是0就改成1。

例如「3,5,8」的NIM值為14 = (1110),最高位是第四位。8 = (1000)的第四位為一,所以這個子狀態的NIM值應變為(0110) = 6。必勝策略就是在8的一堆上拿兩個。

「3,4,5,6,7」的NIM值是3 = (11)。要找一個第二位為1的子狀態,3,6,7都可以。大家可以自己算一下應該拿幾個。(答案:3,7拿3個,6拿1個)

NIM還有一個變種:走最後一步為負。這種情況下,一開始還是和普通NIM一樣,但到了隻有一個子狀態的NIM值大於1時就不同了。如果有奇數個子狀態為1,就把大的一堆拿光,如果有奇數個,就剩一個。也就是說,給對手剩下奇數個1。

下麵再看幾種NIM類型的遊戲。

問題6。現代保齡球是由古希臘一種叫KAYLES的遊戲發展而來。KAYLES的規則如下:11個瓶排成一排,兩人交替擊瓶,可以擊倒任意一瓶,也可以擊倒相鄰兩瓶(不準故意擊不中)。擊倒最後一瓶為勝。現在對手擊倒2號瓶,問怎樣才能獲勝?

這個遊戲的特點是可以產生出新的子狀態。一開始是狀態「11」,現在變成了「1,9」。但所有的原理仍然有效。可以算出前9個數的NIM值為

1,2,3,1,4,3,2,1,4。

因為N「1,9」= 5,必勝策略是把值為4的子狀態變成1,簡單算一下,N「8」= 1,N「2,6」= 1,所以必勝策略包括擊倒3號,5號,9號,11號瓶。

KAYLES遊戲的NIM值已經完全解出:除了少數例外,以12為周期取下列值:1,2,8,1,4,7,2,1,8,2,7,4。僅有的13個例外為:N「3」= N「6」= N「18」= N「39」= 3, N「9」= N「21」= N「57」= 4,N「11」= N「22」= N「34」= N「70」= 6,N「15」= 7,N「28」= 5。

類似於問題4,KAYLES中所有單一狀態的NIM值也都不是0。實際上也很容易看出,對沒有空檔的初試狀態,必勝策略就是擊中央,總數是單數時打一個,雙數時打兩個。以後保持對稱就可以了。

問題7。砍樹遊戲:在紙上隨便畫幾棵樹(例如下圖),兩人輪流砍。每次可以在任何一個節點處砍掉一枝。可以砍掉整個一棵樹。如果一個節點有幾個樹枝,隻能砍掉一枝。最後無樹可砍的人負。

就下圖而言,先砍能不能獲勝?



答案: 如果沒有分叉,即每個節點隻有一枝,這就變成了標準NIM。有分叉的道理也差不多:左邊的樹有兩枝,中間的樹上麵兩枝可以抵消,中間兩枝可以抵消,所以相當於一枝。我們知道在NIM裏麵(1,2,3)是負狀態,所以先砍的人可以把第三棵樹左邊的小枝砍掉,剩3枝。

對更複雜的樹,還有簡單算法。

定理。如果在節點處有超過一枝,那麽這些枝可以用一枝代替,這一枝的NIM值為這些枝的NIM和。

以右邊的樹為例,兩小枝的NIM值分別為1和2,它們能用值為3的一枝代替,也就是說整個樹的NIM值為4。這樣就可以清楚的看到唯一正確解是把右邊樹的NIM值變為3,即砍掉左邊小枝。

拿石子類型的遊戲多極了,有些是NIM的變種,有些不是,但道理都有點相似。下麵給出一些例子:

問題8。有兩堆石頭,每堆都是100個。現兩個人來拿石頭,規則如下:
1)隻能從一堆拿,至少拿一個,多拿不限;
2)如果某人拿光一堆,這個人可以把另一堆分成兩堆,也可以不分;
3)拿最後一個的人贏。
現問先拿者輸還是後拿者輸?應如何拿?

規則可以稍微改一改:

問題9。有若幹堆石子,兩人玩拿石子遊戲。每人每次可以選下列兩種走法之一:任選一堆拿走一個石子,或任選至少有兩個石子的一堆,將其分成兩堆。什麽時候先走的人有必勝策略?

問題10。有若幹堆石子,兩人輪流拿,每次從其中一堆中拿一個。拿走的石子可以扔掉,也可以加在後麵挨著的一堆上。(如果從第3堆拿一個,拿走的石子可以扔掉,也可以加在第4堆上,即使第4堆當時是空的也可以。如果從最後一堆拿,就隻能扔掉了。)拿最後一個的勝。

假設一開始有5堆,每堆一個,先拿有沒有必勝策略?有幾種?

問題11。和第1題一樣,但是拿走的一個可以加在後麵任意一堆上。(如果從第3堆拿一個,一共有7堆,可以加在第4到第7的任意一堆上。)

還是一開始有5堆,每堆一個,先拿有沒有必勝策略?有幾種?

問題12。有一堆石子共N顆(N>1),兩人輪流從中取石子,其數目依次是a1, b1, a2, b2, ....。取石子的規則是:
(1) 第一次不能拿完,即:1≤a1≤N-1;
(2) 以後每人取石子數不能超過對方剛取的數。即:a1≥b1≥a2≥b2≥ ....≥1;
取最後一顆石子的為勝者。什麽時候有必勝策略?第一次應該拿幾個?

問題13。桌上有一堆石子。你和對手輪流拿。誰拿到最後一顆算誰勝。規則是:
1。第一個人第一次不能拿完。
2。從第二次開始,每次所能拿的顆數是從一到兩倍於你的對手上一次拿的顆數。比如你的對手上次拿了4顆,那麽你就可以拿1顆到8顆裏的任意數。
什麽時候有必勝策略?第一次應該拿幾個?

問題14。桌上有15個球。兩人從中論流取球,每次可以取1,2,3個,最後取完這15個球後,看誰總共取的球數是奇數誰贏。第一次應該拿幾個?

問題15。桌上有15個球。兩人從中輪流取球,每次可以取1到4個,最後取完這15個球後,看誰總共取的球數是奇數誰贏。第一次應該拿幾個?

[ 打印 ]
閱讀 ()評論 (1)
評論
yxwu 回複 悄悄話
對拿石子遊戲(NIM) 理論的疑問


可能數學專業人士的思想太複雜,很多問題其實很簡單:


問題4。(和上一題差不多。)有一塊6X8的矩形巧克力,左下角那一塊壞了。兩人分吃,每次掰時,先選定一塊,然後把這塊及其上麵和右麵的都掰掉。(剩下的是鋸齒形。)吃最後一塊為負。第一次應該掰多少?

這一題的NIM值就很難算了,要編一個程序才行。下麵是矩形的NIM值。(還不包括鋸齒形。)

5,8,12,16,21,13,28,32
4,7,11,13, 6,21,23,22
3,5, 9, 6,13,16,19,12
2,4, 5, 9,11,12,13,16
1,2, 4, 5, 7, 8,10,11
0,1, 2, 3, 4, 5, 6, 7

==〉很簡單的掰掉0 的上方 1 的那塊留下0 這塊不就行了嗎?



下麵按照 NIM 路線算出來的又是必敗策略:

-------------
在NIM遊戲裏,初始狀態「3,5,7」的必勝策略是什麽?狀態「3,5,8」的必勝策略又是什麽?狀態「3,4,5,6,7」呢?

前麵已經算過這個初始狀態的NIM值N「3,5,7」為1,必勝策略就是從任何一堆拿一個就行了。

一般來說,先把NIM值表成二進位數,找一個在NIM值的最高位為1的子狀態,然後比較整個狀態和子狀態的NIM值。所有整個狀態為1的位上,子狀態是1就改成0,是0就改成1。

例如「3,5,8」的NIM值為14 = (1110),最高位是第四位。8 = (1000)的第四位為一,所以這個子狀態的NIM值應變為(0110) = 6。必勝策略就是在8的一堆上拿兩個。

「3,4,5,6,7」的NIM值是3 = (11)。要找一個第二位為1的子狀態,3,6,7都可以。大家可以自己算一下應該拿幾個。(答案:3,7拿3個,6拿1個)

NIM還有一個變種:走最後一步為負。這種情況下,一開始還是和普通NIM一樣,但到了隻有一個子狀態的NIM值大於1時就不同了。如果有奇數個子狀態為1,就把大的一堆拿光,如果有奇數個,就剩一個。也就是說,給對手剩下奇數個1。

---------------------
對上麵所有問題,我的勝策很簡單:先拿者勝!
每堆拿剩一個,最後一堆全拿光。
如果走最後一步為負,則在拿最後一堆時仍留一個。

--------------------------


下麵這個按NIM值計算出來的結果也有問題:

-------------
問題6。現代保齡球是由古希臘一種叫KAYLES的遊戲發展而來。KAYLES的規則如下:11個瓶排成一排,兩人交替擊瓶,可以擊倒任意一瓶,也可以擊倒相鄰兩瓶(不準故意擊不中)。擊倒最後一瓶為勝。現在對手擊倒2號瓶,問怎樣才能獲勝?

這個遊戲的特點是可以產生出新的子狀態。一開始是狀態「11」,現在變成了「1,9」。但所有的原理仍然有效。可以算出前9個數的NIM值為

1,2,3,1,4,3,2,1,4。

因為N「1,9」= 5,必勝策略是把值為4的子狀態變成1,簡單算一下,N「8」= 1,N「2,6」= 1,所以必勝策略包括擊倒3號,5號,9號,11號瓶。
----------------

我的策略就將完全擊敗 NIM 計算:

1, ,3,4,5,6,7,8,9,10,11 輪康MM, 按照上麵算的必勝策略包括擊倒3號
1,,,4,5,6,7,8,9,10,11 輪對手,擊倒7,8兩瓶
1,,,4,5,6,,,9,10,11 輪康MM,
此時無論康MM選哪一個或兩個擊,都將輸掉。

例如:
康MM選 1 ==〉4,5,6,,,9,10,11
對手選 4 ==〉5,6,,,9,10,11 此後,無論康MM 怎麽選,都會輸
例如:康選5或者6,對手就選9,10; 康選5,6,對手選10;康選10,對手選5,6。。。

又例如:
康MM選 4(或6,9,10都一樣) ==〉1,,,5,6,,,9,10,11
對手選1, ==〉5,6,,,9,10,11 回到了上麵的例子

又例如:
康MM選 5(或10都一樣) ==〉1,,,4,,6,,,9,10,11
對手選9,10 ==〉1,,,4,,6,,11 仍然是對手勝!

所以NIM理論很值得懷疑!(說實在的,我都沒有搞明白康MM的NIM值是怎樣算出來的).
登錄後才可評論.