你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
示例:
输入: 4
输出: false
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
别人的解答:(这是一个巴什博奕问题)
class Solution(object):
def canWinNim(self, n):
"""
:type n: int
:rtype: bool
"""
if n % 4 == 0:
return False
else:
return True
还可以这样写:(一行代码搞定)
return n % 4 != 0
巴什博奕问题:
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
如果n = m + 1, 我们假设第一个人拿走了k个, 还剩下 m + 1 - k。 因为1<=(m + 1 - k)<= m, 所以, 剩下的部分一定可以被第二个人一次性取走。
现在我们将上述规律加一推广:
如果n=(m+1)r+s(r∈ N,s<= m);
那么先取者要拿走s个物品,如果后取者拿走k(k<= m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,
以后保持这样的取法,那么先取者肯定获胜
那么在我方取最优解的情况下:
巴什博弈的必败态: (m + 1)* r (r∈ N);
巴什博弈的必胜态: (m + 1)* r + k (1<=k<= m, r ∈N);
转载网址:https://blog.csdn.net/sun897949163/article/details/50609070