leecode练习--292、Nim游戏
题目要求:
你和你的朋友,两个人一起玩 “Nim 游戏”,桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏
示例:
输入: 4
输出: false
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
解题思路:
当石头还剩4个时,无论取1个还是2个还是3个,都必定是后一个取石头的赢,以此为突破口,
因此,我们可以这么想,当石头个数为5,6,7时,我们是不是可以通过取1,2,3来达到只剩4个石头的目的,我们就必赢
而当石头个数为8时,我们无论是取1个还是2个还是3个,都必定剩余5,6,7中其中之一,而此时对方就可以必胜(通过上一条叙述,我们转换为对手的立场可以想到,想不到就别学了)
当石头个数为9,10,11时,我们可以通过取1,2,3将剩余石头个数控制在8,而对方必输(再通过上两条叙述去想,想不到?那还玩个锤子)
。。。。。。
可以预想到此题可以写成:if n % 4 == 0: return False
。但其实这题暗含了一个博弈论的思想——巴什博弈:if n % (m+1) == 0: return False
,也就是只要我们取完之后,保证剩余的数是最多能取的数多一的倍数即可
代码实现:
class Solution:
def canWinNim(self, n: int) -> bool:
m = 3
#巴什博弈
if n%(m+1) == 0:
return False
else:
return True