Leetcode 292. Nim Game 题解

题目链接为:点击打开链接

题目要求:Nim 游戏规则如下,我和朋友一起玩拿石头的游戏,每人每次可以拿1-3块石头,拿到最后一块石头的人获胜。在游戏中,我是先拿石头的那个人。给定石头总数,判断我是否可以获胜。


思路:根据题目要求,“我和朋友都很聪明”,意味着我和朋友任何一个人输掉游戏,都是因为在这局游戏中TA无论怎样拿都不可能获胜。也就是说给定石头总数,在了解套路的情况下,输赢是确定的。那么接下来试着找找规律吧。石头总数(记为N)。

N=1, 我先拿1个,我赢。 (先手赢)

N=2,我先拿2个,我赢。 (先手赢)

N=3,我先拿3个,我赢。 (先手赢)

N=4, 无论我拿1-3个,都是对手赢。 (后手赢)

N=5, 这是考虑下,我是第一个拿,我想赢,看一下N=1,2,3,4的情况,其中当N=4时,无论如何后手会赢,那么只要我把现在的情况转化为N=4,而且我后拿石头,我就可以赢了。所以,我只拿1个。这时候情况就变成了,N=4,我要在朋友之后拿(后手拿),所以我会赢。 (先手赢)

N=6, 同上,我会拿2个,这时候情况就又变成了N=4,我后手拿,所以我会赢。 (先手赢)

N=7,同上,我会拿3个,这时候情况就又变成了N=4,我后手拿,所以我会赢。 (先手赢)

N=8,考虑下,假设我拿1,2,3个,情况会变成N=5,6,7,都会是先手赢,但是我拿完之后就会变成后手,所以无论如何都会输。 (后手赢)

.....


总结下规律:

N=1 先手赢

N=2 先手赢

N=3 先手赢

N=4 后手赢

---------------------------

N=5 先手赢

N=6 先手赢

N=7 先手赢

N=8 后手赢

...

所以规律显而易见了,只要石头总数是4的倍数,我(先拿者)就会输,其他情况都会赢。


python代码如下:

class Solution(object):
    def canWinNim(self, n):
        """
        :type n: int
        :rtype: bool
        """
        return False if n % 4 == 0 else True




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值