Leetcode:Nim游戏

你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入: 4
输出: false 
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
     因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

解题思路:

递推。首先,自己先手,意味着1,2,3都是赢而4必然输。5,6,7也是必然赢,因为可以拿走1-3块使得对面起手时只有4块,那么之前计算过4起手必然输,自己8起手必然输,因为对手会按照一样的方法赢了你,很容易发现规律,周期为4。

我们假设起手时 当前总数为4n时必然输,4n+1,4n+2,4n+3必然会赢,那么你的起手总数为4(n+1)时,你必然会输,因为不论你拿走1,2,3,剩下的都是4n+1,4n+2,4n+3,这个时候对手和你一样也必然会赢,也就意味着,你必然会输。同样如果你的起手时是4(n+1)+1,4(n+1)+2,4(n+1)+3,那么你都可以拿走一些使得总数为4(n+1),使得对手和你一样在4(n+1)的时候必然输。于是就有了这样一个递推关系,而我们之间算过n=1,2,3,4的情况,这样一来就足够证明n%4==0时必然会输,其余必然会赢。

C++代码
class Solution {
public:
    bool canWinNim(int n) {
        return n % 4 != 0;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_23523409/article/details/84555605