LSGO——LeetCode實戰():292題 Nim遊戲(Nim Game)

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

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

示例:

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

思路:這個題目其實我感覺更像一個數學題目,題目給了我們一個例子,當輸入爲4時,必輸。

而這個4是很關鍵的,當輸入爲1,2或3時,我們發現你是必贏的。所以這個時候,我們思考,無論輸入是多少,無論哪種拿法,當你們桌上的石頭數小於或等於4時,誰贏誰輸就已經是定局了。而前面已經拿掉的石頭,無論它是怎樣的拿法,只要在雙方有相同的拿取次數時,都相當於一個新的Nim 遊戲。

當石頭數爲4的倍數的時候,第二個人完全可以使兩個人每次拿取的石頭數一共爲4,從而保證第二個人自己必贏。

當不爲4時,情況就很複雜了,但是你依舊存在

class Solution(object):
    def canWinNim(self, n):
        """
        :type n: int
        :rtype: bool
        """
        return False if n % 4==0 else True

贏的局面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章