leetCode 292. Nim Game

    題目連接:https://leetcode.com/problems/nim-game/

    題目內容:

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.

Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.

For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.

    題目分析:

    題目AC之後我查了一下“Nim Game”究竟是什麼鬼,發現原來leetCode 292這道題目不過是一個簡化版,這裏是科普nim game的一些材料,個人表示看得頭有點大。leetcode這道題是醬紫的:一堆石子,兩個玩家,每次一個玩家只能拿1~3個石子,最後一個人拿走剩下全部石子的玩家贏得遊戲,你是玩家之一,而且第一個拿,問,給出一堆石子判斷你能贏與否。仔細思考的話,這道題其實是一道數學題,當石子爲1,2,3的時候,先手玩家一次性拿走可贏,當石子爲4的時候,先手玩家必輸(因爲你的對手也是個聰明的傢伙,在你拿走部分1或2或3個石子的時候,他只要把剩下的拿走就贏了),後面的石子數量循環這個規律。因此,當石子數目是4的倍數的時候,先手玩家(不用看,就是你)一定輸,因爲當你拿走1~3個石子的時候,對方只要拿走3~1個石子跟你湊足4個,使得每兩次拿走都是4的倍數,如此重複下去,剩下4個石子的時候,又輪到你先手拿石子,對方肯定能將剩下的全部拿走。把上面的規則定爲rule1的話,當石子數目不是4的倍數,即比4的倍數多出1~3個石子的時候,作爲先手玩家你可以將多出來的這部分全部拿走,這時候遊戲變成了“石子數目爲4的倍數,而且對方先手拿石子”的遊戲,這時候後面的步驟你只要遵循rule1就可以贏得遊戲了。

bool canWinNim(int n) {
    return (n%4)!=0;
}
    很明顯,如果每次能拿k個石子,只要將上述代碼的“4”換成“k+1”即可。老習慣,提交ac之後我去討論區看了其他人的代碼,有不少人直接用位運算取最後兩個bit(即1~3),與輸入做一個“與運行”,原理也是判斷取餘是否爲0,但是用位運算肯定更快,畢竟計算機最喜歡的運算。

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