程式設計之美 MIN 1 一排石頭的遊戲

2021-05-27 06:02:40 字數 2504 閱讀 7721

**:

1. 原題

1.1 題目

n塊石頭排成一行,每塊石頭有各自固定的位置。兩個玩家依次取石頭,每個玩家每次可以取其中任意一塊石頭,或者相鄰的兩塊石頭,

石頭在遊戲過程中不能移位(即編號不會改變),最後能將剩下的石頭一次取光的玩家獲勝。這個遊戲有必勝策略嗎?

1.2 解答

已知:石頭數量為n,假設兩個玩家分別為玩家a和玩家b,且玩家a先取石頭。

當n<=2時,玩家a可以直接取完所有的石頭,玩家a有必勝策略。

當n=3時,玩家a先取中間的1個石頭,剩下的兩個石頭,玩家b只能取其中的1個,最後1個由玩家a取得,玩家a有必勝策略。

當n=4時,玩家a先取中間的2個石頭,這會又剩下2個石頭,玩家b還是只能取其中1個,最後乙個由玩家a取得,玩家a有必勝策略。

當n>4,且n為奇數時,玩家a取中間的1個石頭,剩下的左邊石頭情況和右邊石頭情況一樣,那麼無論玩家b如何取石頭,玩家a只要

在相反的方向取相同數量的石頭即可,如此下去,最後必然玩家a取得最後的石頭,a有必勝策略。

根據上面的歸納,先手的玩家只有把中間的石頭拿走,如果n是奇數,就拿走中間的1個石頭,如果n是偶數,就拿走中間的2個石頭,

這樣留給玩家b乙個對稱的局面,接著,無論玩家b怎麼拿石頭,玩家a都保證對稱局面不變,這樣,最後肯定是a取得最後的石頭。   

2. 擴充套件1(下邊的做法,不清楚對不對,感覺有些問題)

2.1 題目

若規定最後取光石頭的人輸,又該如何應對?

2.2 解答

n=1時,a必須取得這唯一的也是最後的乙個石頭,a必然輸掉,這是必然結果,無需策略。

n=2時,a取乙個石頭,那麼b必然取得剩下的乙個石頭,a有必勝策略。

n=3時,a取兩個石頭,那麼b必然取得剩下的乙個石頭,a有必勝策略。

n=4時,若a取兩個石頭,那麼b取乙個石頭,a只能取最後剩下的乙個石頭。

若a取乙個石頭,那麼b取兩個石頭,a只能取最後剩下的乙個石頭。

因此,無論a怎麼取,b都有必勝策略。

n=5時,a只需取邊上的乙個石頭,這樣就轉化為n=4,b先取了,這樣根據上面的分析,可知n=4時,後取的有必勝策略,

因此,a有必勝

策略。

n=6時,a只需取邊上的兩個石頭,這樣就轉化為n=4,b先取了,這樣根據上面的分析,可知n=4時,後取的有必勝策略,

因此,a有必勝

策略。

分析到這裡,貌似是:n%3=1時,b有必勝策略,n%3=2和n%3=0時,a有必勝策略。但是證明方法一直沒有想清楚,

一排石頭的遊戲」的文章進行了證明,不過證明的核心地方一筆帶過,相當於沒有證明。

感覺這個擴充套件中比較麻煩的地方在於「一排石

子」,而且n很大的情況下,如果一步一步a和b分別取石子後,最後得到的石子之間

可能不是連續的,這樣結果就不確定了。比如:最後

還有3個連續的石子,a先取,a有必勝策略;最後還有3個都不連續的石子,a先取,a肯定失敗。所以呢,最後剩餘的石頭狀態很重要,現在我只是分析到這裡,也沒看到網上誰很好的解決了這個問題。

3. 擴充套件2

3.1 題目

若兩個人輪流取一堆石頭,每人每次最少取1塊石頭,最多取k塊石頭,最後取光石頭的人贏得此遊戲。

3.2 解答

1)極端情況:k>=n

玩家a可以直接取掉所有石頭,獲得勝利。

2) 一般情況:k

這裡面有個規律,就是,無論乙個玩家拿了多少個石頭,另乙個玩家都能夠選擇相應的石頭數量,使得兩個玩家一起拿k+1個石頭。

從上面這個思路,我們考慮n與k+1之間的數值關係:

n = (k+1) * c + d,其中c>=1,d>=0

當d!=0時,玩家

a先取d個石頭,這樣還剩(k+1)*c+1個石頭。然後輪到玩家b取石頭,不管玩家b取了多少個石頭,玩家a都再取相應

的石頭,使得玩家a和玩家b一起取(k+1)個石頭,這樣,還剩(k+1)*(c-1)+1個石頭,如此往復,最後,肯定a取完石頭。

舉例說明:

剩餘石頭數目         取石頭

(k+1) * c + d          a取d個

(k+1) * c          b取x個,a取(k+1-x)個

(k+1) * (c-1)     ...

k+1                      b取x個a取(k+1-x)個0

當d=0時,無論a取多少個石頭,b取相應的石頭,使得a和b一起取(k+1)個石頭,這樣最後取到石頭的肯定是玩家b。

舉例說明:

剩餘石頭數目        取石頭

(k+1) * c               a取x個,b取(k+1-x)個

(k+1) * (c-1)         ...

...                         ...

k+1                      a取x個,b取(k+1-x)個 0

即n%(k+1)=0時,玩家b有必勝策略,n%(k+1)!=0時,玩家a有必勝策略。

可以看出來,如果k很大的話,而n的數值是隨機的話,先手的優勢是很明顯的。

程式設計之美 NIM(1)一排石頭的遊戲

題目大意 n塊石頭排成一行,兩個玩家依次取石頭,每個玩家可以取其中任意一塊或者相鄰的兩塊,最後能將剩下的石頭一次取光的玩家獲勝。分析 1 n 1 n 2,必勝 2 n 3,先取者取中間1塊石頭,左右還剩下各1塊石頭,無論第二個人怎麼取,己方必勝 3 n 4,先取者取中間2塊石頭,還是左右各剩一塊,己...

程式設計之美1 11NIM 1 一排石頭遊戲

解決問題的思路 當題目中有 n 出現時,可以從假設n 1開始,逐步掌握規律 擴充套件問題1 若規定最後取光石頭的人輸,先取者是否有必勝策略 當n 1時,必輸 當n 2時,必勝 當n 3時,1,2,3 先取1,2或者先取2,3,有必勝策略 當n 4時,1,2,3,4 無論怎樣取,對手不放水,先取者輸,...

程式設計之美 一排石頭的遊戲(拓展問題)

程式設計之美 一書中1.11章節介紹了nim遊戲的取勝問題。n塊石頭排成一行,每塊石頭有各自固定的位置。兩個玩家依次取石頭,每個玩家每次可以取其中任意一塊石頭,或相鄰的兩塊石頭,石頭在遊戲過程中不能移位 即編號不會改變 最後能將剩下的石頭一次取光的玩家獲勝。在這樣的規則下,先取的玩家可以在第一步取走...