1. 程式人生 > >Leetcode:Nim遊戲

Leetcode:Nim遊戲

你和你的朋友,兩個人一起玩 Nim遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作為先手。

你們是聰明人,每一步都是最優解。 編寫一個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。

示例:

輸入: 4
輸出: false 
解釋: 如果堆中有 4 塊石頭,那麼你永遠不會贏得比賽;
     因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最後一塊石頭總是會被你的朋友拿走。

解題思路:

遞推。首先,自己先手,意味著1,2,3都是贏而4必然輸。5,6,7也是必然贏,因為可以拿走1-3塊使得對面起手時只有4塊,那麼之前計算過4起手必然輸,自己8起手必然輸,因為對手會按照一樣的方法贏了你,很容易發現規律,週期為4。

我們假設起手時 當前總數為4n時必然輸,4n+1,4n+2,4n+3必然會贏,那麼你的起手總數為4(n+1)時,你必然會輸,因為不論你拿走1,2,3,剩下的都是4n+1,4n+2,4n+3,這個時候對手和你一樣也必然會贏,也就意味著,你必然會輸。同樣如果你的起手時是4(n+1)+1,4(n+1)+2,4(n+1)+3,那麼你都可以拿走一些使得總數為4(n+1),使得對手和你一樣在4(n+1)的時候必然輸。於是就有了這樣一個遞推關係,而我們之間算過n=1,2,3,4的情況,這樣一來就足夠證明n%4==0時必然會輸,其餘必然會贏。

C++程式碼
class Solution {
public:
    bool canWinNim(int n) {
        return n % 4 != 0;
    }
};