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.
题目大意是有一堆石头,每次你和你的对手轮流选择拿出1个,2个或3个石头,拿到最后石头的人获胜。
题目最后一段的例子也说明了:如果有4个石头,我先拿的话,无论我拿1/2/3个石头,我都会输。因为最后一个石头总是会被对方拿走。
现在我知道4是一个关键的节点,我们一一列举来看看有没有什么规律:
1 2 3 4 5 6 7 8 9 10 11 |
石头个数 输/赢 1 赢 2 赢 3 赢 4 输 5 赢 6 赢 7 赢 8 输 ... ... |
也就是说,我拿完之后,给对方剩下的石头个数是4的倍数,我就能获胜。
解法:
1 2 3 4 5 6 |
class Solution { public: bool canWinNim(int n) { return !(n%4==0); } }; |