leecode练习--292、Nim游戏

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
posted @ 2019-05-21 20:27  newking_itman  阅读(141)  评论(0编辑  收藏  举报