取石子游戲(hdu 2516)

這個遊戲的一種版本是這個樣子的:

桌子上有若干個石子,兩人輪流取。第一個人可以取走任意多個,但至少取走一個,至少留有一個。此後的過程中,必須取走一個,但不得超過對手上次取走的兩倍。拿到最後一個石子的贏得遊戲。

好了,看起來似乎很簡單,因爲它和這個很像:

桌子上有若干個石子,兩人輪流取。每次必須取走一個,但不得超過三個。拿到最後一個石子的贏得遊戲。

相信第二個遊戲大家都覺得很簡單就可以找到最優策略。可惜的是,我說的這個版本要比第二個難了不少。因爲它居然和斐波那契數列有關係,關係如下:

當且僅當石子數量不是斐波那契數,先手有必勝策略。

想不通吧,一眼看上去,這道題目和斐波那契數列一點聯繫都找不到。但是接下來我將證明這個結論是正確的,並給出一種最優策略。首先讓我們來看看這些東西:
0. 記斐波那契數列的第i項爲Fi
1. Fi+1 = Fi + Fi-1 --這是斐波那契數列的定義
2. Fi ≤ 2×Fi-1 --把左邊按(1)式拆開就很容易證明
3. Fi > 4/3×Fi-1 --4/3×Fi-1 = Fi-1+Fi-1/3 < Fi-1+Fi-2 = Fi

下面我們用[a,b]來表示遊戲當前的局面,其中a表示桌上剩餘的石子數量,b表示輪到行動的玩家可以拿走的石子數量。也就是說,如果b≥a就贏了。
4. 如果輪到先手行動時局面爲[a,b]時,無論先手如何行動後手都有有必勝策略。那麼對於任意的b’ < b,當輪到先手行動時的局面爲[a,b']時,後手仍然有必勝策略。 --這個是個簡單的邏輯推理。

好了,我們開始證明當n=Fi時,後手有必勝策略。

顯然,當遊戲開始的時候,局面爲[Fi,Fi-1]。先手的可以拿走任意多個,但是它一定不願意拿走大於等於Fi/3個石子,因爲這以爲着後手可以在後一輪拿走剩下的所有石子。設先手拿走k < Fi/3個石子。則局面變爲[Fi-k,2k]。

我們可以把其中的Fi拆開,表示爲[Fi-1+Fi-2-k,2k],然後呢,如果滿足Fi-2≤3k,那麼後手只需要取走Fi-2-k個石子就能讓局面回到類似於[Fi-1,b]的樣子,因爲此時b = 2×(Fi-2-k) ≤ 4/3×Fi-2 < Fi-1,意味着先手不能在下一輪拿走完剩下的石子,重新進入我們的圈套。

可是如果不滿足滿足Fi-2<3k呢?嘿嘿,奸詐的夜弓繼續把Fi-2拆分成更小的F,夜弓重複這個步驟,每次都拆分最小的那個F[注1],直到某一步拆分得到了相鄰的兩個斐波那契數Fj和Fj+1使得Fj≤3k。那麼我們取走Fj-k個石子[注2],由於我們前面所說的2×(Fj-k) ≤ 4/3×Fj < Fj+1仍然成立,所以對手在下一回閤中還是不能將Fj+1全部取走,所以很我們很愉快的繼續玩我們的把戲。如果先手足夠聰明,他能夠拖延時間,但最後擺在他面前的必然是一個[3,2]的佈局,顯然無論他如何行動都將輸掉遊戲。

那麼,如果開始的時候石子數目不是斐波那契數呢?難道後手不能用類似的方法贏得遊戲嗎?是的,因爲先手可以在第一步拿走任意數目的石子,比如拿走適當數目的石子使得剩下的爲一個斐波那契數或者若干個斐波那契數之和。而這一點非常容易做到。有興趣的讀者可以自己思考這個問題。^_^

注1:每次都拆分最小的那個F可以保證我們把石子數目拆分成了不同的斐波那契數,這點非常重要。

注2:Fj-k > 0,因爲3Fj > Fj+Fj+1 = Fj+2 > 3k,否則分解在Fj+2處就停止。 


發佈了12 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章