這個題目來自於程式設計之美上的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節介紹了乙個取石頭的遊戲,遊戲規則如下 n個石頭排成一行,兩個玩家依次取石頭,每次可以取一塊或者相鄰的兩塊,取到最後一塊石頭的獲勝。如果a方先手,如何保證自己獲勝?書中給出了乙個a必勝的方案,如果總共有奇數個石頭,a取走中間的一塊,如果總共有偶數塊石頭,a取走中間的兩塊,這樣石...
一排石頭的遊戲(續)
我們繼續分析9棵石頭的情況,在正式開始研究之前,讓我們先研究幾種簡單的情況。前面的分析中我們已經研究了幾種先手必輸的方案,包括1,4,2 2 其中 表示不連續的兩堆或多堆 3 3。我們另外引入幾個新的先手必輸的方案,分別是 1 2 3 假設a先取,a所有可能的取法包括 1 取走1,變成2 3,相當於...