题目链接为:点击打开链接
题目要求: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