题目:
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.
题意:
你和小伙伴玩游戏,从一堆石头里面每次可以拿出来一个到三个之间,谁最后拿完石头谁赢。你现在是第一个拿石头的,能不能找最优的策略,保证你能赢得局全部拿下,赢不了的那就没办法了。
思路:
我甚是奇怪,leetcode竟然开始弄智力题了,其实我们可以看出,由于每次能够拿得是1到3之间,那么对手拿k个,你一定可以拿4-k个,所以你只需要保证你第一次拿完之后剩下的是4的整数倍就行了,所以一开始的石头只要不是4的整数倍,也就是说你第一次拿n%3之后的石头后,剩下的就是4的整数倍的石头了,所以根据我们的凑4的策略,接下来对方拿k个你就拿4-k个,最终一定能够赢得,所以题目就变成了判断当前总石头的数量是不是4的倍数,不是的话就是我赢,否则对方赢。代码极其简单,如下,一行就行。
以上。
代码如下:
class Solution {
public:
bool canWinNim(int n) {
return n % 4 != 0;
}
};