今天是小浩算法“365刷题计划”第58天。昨天是为大家分享了一道打着“脑筋急转弯”tag的题目,然后我顺便就把这个类型的题目全部筛选出来看了看,发现总共没几个,所以就想的干脆一次全部讲完吧。反正我们还有307天....

01

PART

NIM

这个类型的题目,其实除了废话多一点,好像没什么特别的。

你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入: 4

输出: false

解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;

因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

(瞪一瞪就全部掌握)

PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。

02

PART

题目分析

这种问题,如果没有思路,可以先自己找个纸写写画画,找找规律。

首先如果石头数小于4个,那么因为你是先手,一把拿走,肯定会赢。

而如果石头是4个,那不管你是拿了1,2,3个,最后一个都可以被你的对手拿走,所以怎么样都赢不了。

再继续分析到8个石头:对于5,6,7而言,你只需要对应的拿走1,2,3,然后留下4个,则对方必输。但是如果你要面对的是8,不管先拿(1,2,3)个,另一个人都可以通过 8-(1,2,3) ,使得你面对4个石头,则你必输无疑。通过观察,我们发现,好像是只要N是4的倍数,我们就必输无疑

尝试性的写下代码:(这个,什么语言都无所谓吧....)

1//go
2func canWinNim(n int) bool {
3    return n % 4 != 0
4}

(发现竟然神奇的通过了?)

郑重申明(读我的文章必看):

  • 本系列所有教程都不会用到复杂的语言特性,不需要担心没有学过相关语法,使用各语言纯属本人爱好。

  • 作为学术文章,虽然风格可以风趣,但严谨,我是认真的。本文所有代码均在leetcode上进行过测试运行。

  • 算法思想才是最重要的。

03

PART

证明过程

脑筋急转弯的题目不是很多见,但是某些公司的某些人却钟情于此,如果是本着考察对方的思维能力,那我觉得还是挺好的。但若是为了寻找作为面试官的一丝丝优越感,那就只能是。。呵,打扰了。。

首先需要说下的是,这个问题属于博弈论。NIM的意思就是“尼姆”,并不是什么高大上的英文缩写。所以,NIM游戏一般也称之为尼姆游戏。说白了,就是设置两个对手,通过回合制的方式来玩的一种数学战略游戏,在早期网络不发达的时候很火。毕竟那时候连梦幻都没有,更别说王者。(非戏说,很多回合制游戏,其实本质就是数学游戏。而对于王者这种多人实时竞技游戏更是如此,如果想玩好,数学学不好,基本就凉凉。有兴趣的,可以了解一下游戏平衡师

回到本题,假若对于先手有N个石头,那么后手的可能性有N-1,N-2,N-3三种。只有当后手的这三种可能性都必胜时,N才会必败。因为题目说了,我们都是聪明人(一般博弈论的问题都会有这句话),那如果后手的三种可能性中,有哪一种必败,作为先手,我们一定会走出这种可能性。那这种可能性是什么,其实就是让对方去面对4的倍数。如果先手我们遇到一个不是4的倍数的值x,有:

4k > N > 4(k-1)

N一定处于两个4的倍数之间,因为N本身不是4的倍数,那N距离最近的4的倍数的值最大为3。所以,只要我们不是面对4的倍数,作为先手,我们一定可以取走(12,3),使剩余的值变成4的倍数,则后手必输无疑。

昨天的题目,还没有学习的,抓紧:

漫画:脑筋急转弯算法题目(???)

如果想看我其他骚操作的,可以看下面这些文章:

漫画:骚操作系列(灯泡开关的经典面试题)

漫画:骚操作系列(必须掌握的疯子找座问题)

漫画:骚操作系列(一文让你学会如何用代码判断"24"点)

漫画:骚操作系列(ctrl+c 和 ctrl+v 的算法问题)

所以,今天的问题你学会了吗?评论区留下你的想法!

 小浩算法,每日

关注领取《图解算法》高清版

进群的小伙伴请加右侧私人微信(备注:进群)

漫画:脑筋急转弯题目(尼姆问题求解)相关推荐

  1. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)

    题目   尼姆游戏,这是一个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须拿走一部并且最多只能拿走一半物品,然后轮到下一个玩家.拿走 ...

  2. Python题目——实现人机对战的尼姆游戏:假设有一堆物品,计算机和人类玩家轮流从其中拿走一部分。在每一步中,人或计算机可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品

    问题描述:尼姆游戏是这样一个游戏:假设有一堆物品,计算机和人类玩家轮流从其中拿走一部分.在每一步中,人或计算机可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家 ...

  3. HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)

    题目链接:点击查看 题目大意:两个人在玩游戏,给出一个 3 * 3 的棋盘,每个格子上有数个石子,两人轮流取石子,谁先取完某一列或某一行的最后一个石子就算胜利,一般情况是,每个人可以取任意一堆中任意数 ...

  4. 牛客 - A Simple Game(尼姆博弈变形)

    题目链接:点击查看 题目大意:给出 n 个 01 字符串,两个人轮流进行游戏,每次可以选择任意数量的字符串,进行下列操作之一(每个字符串进行的操作可以不同): 选择一个字符串,使得其中的一个 ' 1 ...

  5. HDU - 1907 John(尼姆博弈变形)

    题目链接:点击查看 题目大意:给出 n 堆石子,两个人轮流取,至少取一个,取到最后一个的人输 题目分析:尼姆博弈是取到最后一个的人获胜,这个题正好反着 一个很显然的奇异局势就是,每一堆的石子的个数都为 ...

  6. HDU - 2176 取(m堆)石子游戏(尼姆博奕)

    题目链接:点击查看 题目大意:给出m堆石子,规则是尼姆博弈的规则,问先手必胜还是必败,若能必胜则第一次有多少种方式取石子 题目分析:这个题目是因为一开始知道尼姆博弈的结论,需要异或所有石子来判断的,然 ...

  7. c语言 Nimm game算法,尼姆博奕(Nimm Game)

    尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某 ...

  8. 博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)

    一.  巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关于巴什博奕的游戏了吧. 其实如果知道原理,这游戏一点运气成分都没有,只和先手 ...

  9. 博弈论学习之巴什博弈,尼姆博弈, sg博弈

    博弈论真是一个神奇的东西,感觉和博弈论厉害的人玩游戏绝对会输. 这个博客讲的很好很全面 此类问题一般有如下特点: 1.博弈模型为两人轮流决策的非合作博弈.即两人轮流进行决策,并且两人都使用最优策略来获 ...

最新文章

  1. 准确率至上已是过去式,这些趋势在2020年的AI领域更受关注
  2. python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?
  3. 项目内出现广告位引争议,开源如何持续健康运营?
  4. 编译安装httpd-2.4.12
  5. 用计算机来控制飞船在太空中运行,神舟飞船在太空中靠什么动力运行
  6. 题解 P2610 【[ZJOI2012]旅游】
  7. RK3288 error: undefined reference to 'LOGD'
  8. ami编码设计流程图_AMI码型变换实验 - 图文 -
  9. 拼音工具类PinyinUtils
  10. Excel 通过DDE与INTOUCH通信,数据格式
  11. 【新年新气象_新年CSDN第一篇】斯特林数简介及应用
  12. C语言miller rabin算法,浅谈miller_rabin算法和pollard_rho算法
  13. I2S—音频播放与录音输入
  14. 计算机平均数函数试题,计算机期末Excel表格题及二级考试常用函数
  15. ThreadLocal的短板,我TTL来补
  16. Mint UI—loadmore—Pull down下拉刷新将下拉刷新的箭头标志更换成其他图片(图文)
  17. 华为老总身份彻底曝光,全世界感到害怕!
  18. 运维服务器手段(监控宝,Nagios,百度通告平台)
  19. 用html写除法竖式代码,模拟竖式除法
  20. seo是计算机专业毕业,本科计算机专业的他,在34岁时成为了银行行长

热门文章

  1. ECharts之横向柱状图二
  2. VBA 为什么你redim() 动态二维数组总出错?因为 redim 动态数组不太适合和循环搭配
  3. [AS日记]MacOS的Android Studio卡在Building Gradle Project info走不动 的处理方法
  4. 六边形3d立体缩放动画js特效
  5. 孑然一身,离人何曾是归人
  6. 贝尔曼-福特算法(Bellman-Ford)
  7. java des 加密 单倍长_明明白白使用DES加密算法
  8. SW3518快充方案
  9. 小飞鱼平台介绍——小飞鱼开发者服务平台业务介绍
  10. PC端 UC浏览器页面显示该站点安全证书的吊销不可用