leetcode第292题。这个题是个脑筋急转弯,一堆石头,两个人交替拿,每个人可以拿1-3个,最后一个石头被谁拿走,谁就获胜。
一看这个题我就用递归做了,但是最后超时了,不过没关系,通过递归分析我们可以清楚地看见最后的规律是怎么找出来的。
递归思路,首先n为1,2,3的时候显然是可以获胜的,因为可以全部拿走,如果n为4的时候,无论我怎样拿都会输,n为5的时候可以看看拿走1-3个剩余是什么情况,拿走1个剩余给对手的是4个,根据之前的分析,对手遇到4个则必输无疑,所以我方必胜,只要有一种情况可以赢,那就赢了。
这就是递归的代码:
def canWinNim(n):
if n == 0:
return False
if n == 1 or n == 2 or n == 3:
return True
else:
for i in range(1,4):
ans = not canWinNim(n-i)
if ans == True:
return True
return False
但是继续分析可以看出,这些数从1开始是四个一循环的,四的倍数一定输。原因就是如果输,则意味着你无论怎么拿都会产生一个之前必输的情况,因此是四个一循环。
下面是AC的代码:
class Solution(object):
def canWinNim(self, n):
"""
:type n: int
:rtype: bool
"""
if n == 0:
return False
if n%4 == 0:
return False
else:
return True