zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    【uiautomator】Interfaces+Exception
    【uiautomator】UiDevice
    【uiautomator】Uiautomator API
    【uiautomator】运行命令
    [www.infoshare.cc]【uiautomator】输入中文(输入法安装+测试代码)
    MFC ,List使用
    VC控件DateTimePicker使用方法
    GitHub vs. Bitbucket 不只是功能不同
    免费的私人代码托管(bitbucket) 和 常用git指令
    修改android studio中的avd sdk路径、avd sdk找不到的解决方案
  • 原文地址:https://www.cnblogs.com/itboy-newking/p/10902163.html
Copyright © 2011-2022 走看看