程式設計之美 「拈」遊戲系列一 一排石頭的遊戲

2021-07-04 05:30:16 字數 2937 閱讀 5246

這個題目來自於程式設計之美上的nim(1)一排石頭的遊戲,該類問題能考察面試者的思維,往往是兩個人玩的乙個遊戲,具體形式公司可以具體設定,這裡題目的意思是取石頭的數目有規定,也可以使報數每次只能增加幾個數字等。該類題目往往是要把最後乙個取完石頭定位為贏或者輸。

該類題目第乙個取石頭的人占有主動權也有被動權,如果站在他這個位置上,他先動作能贏則佔據絕對主動(最後取完石頭為贏);相反如果他採取動作後,對方能處處利用他所作的動作,他就被動了(最後取完石頭為輸)。

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-1個石頭,這樣還剩(k+1)*c+1個石頭。然後輪到玩家b取石頭,不管玩家b取了多少個石頭,玩家a都再取相應

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

舉例說明:

剩餘石頭數目         取石頭

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

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

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

...                         ...

1                          a取得最後乙個石頭

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 一排石頭的遊戲,該類問題能考察面試者的思維,往往是兩個人玩的乙個遊戲,具體形式公司可以具體設定,這裡題目的意思是取石頭的數目有規定,也可以使報數每次只能增加幾個數字等。該類題目往往是要把最後乙個取完石頭定位為贏或者輸。該類題目第乙個取石頭的人占有主動權也有被...

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

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

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

1.原題 1.1 題目 n塊石頭排成一行,每塊石頭有各自固定的位置。兩個玩家依次取石頭,每個玩家每次可以取其中任意一塊石頭,或者相鄰的兩塊石頭,石頭在遊戲過程中不能移位 即編號不會改變 最後能將剩下的石頭一次取光的玩家獲勝。這個遊戲有必勝策略嗎?1.2 解答 已知 石頭數量為n,假設兩個玩家分別為玩...