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,但是用位运算肯定更快,毕竟计算机最喜欢的运算。

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