码迷,mamicode.com
首页 > 其他好文 > 详细

leecode练习--292、Nim游戏

时间:2019-05-21 20:51:48      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:python   lse   练习   就是   elf   锤子   聪明人   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

leecode练习--292、Nim游戏

标签:python   lse   练习   就是   elf   锤子   聪明人   nim游戏   个人   

原文地址:https://www.cnblogs.com/itboy-newking/p/10902163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!