时间过得真快,一转眼已经是大年初六啦,大家是不是还在尽情享受假期呢?假期当然少不了游戏,在这最后的慵懒假日,不如让小编来带你玩个小游戏吧!在这个小游戏中,轻轻点击就可以围住可爱的猫猫,然后尽情…咳咳,享受冰冷的胜利吧!

回归正题。今天要讲的游戏叫做围小猫,2021年底在小编我的朋友圈里着实是火了一把,如果你还没有玩过,可以在搜索引擎中搜索“围小猫”。记忆力好的读者可能会记得,这款游戏并不是第一次火了,没错,它就是2014年曾在朋友圈大火过的“围住神经猫”的新皮肤!其原型可以追溯到更早。

上次小编我还未出山放过了你,这次既然被我逮到了,嘿嘿,今天我不把你围住,我就不是中二所小编!

游 戏 介 绍

首先介绍一下游戏规则。起始小猫位于棋盘中心,6-8个障碍物会被预先随机放置在地图上。我方每次点击小圆点就可以在该处放置一个障碍物,而小猫也会向地图边缘移动一格,这样不断重复下去,直到猫猫被障碍物围住游戏胜利,或者到达地图边缘溜走游戏失败。

初上手的时候你会发现,这个游戏并不简单,几乎很难成功。因为棋盘其实并不大,猫只需要5步就可以跑出棋盘边界,很难将小猫堵住。

那么一个自然而然的问题是:如果棋盘足够大,可以保证将小猫堵住吗?在回答这个问题之前,请让我先介绍一下“天使问题”(angel problem)。

天 使 问 题

天使问题[1]首次见于1982年出版的《Winning Ways》一书,由书作者数学家约翰·H·康威(John H. Conway)提出。这是一个双方玩家分别扮演天使和恶魔的博弈游戏。游戏在一个无限大方格棋盘上进行,起始棋盘是空的。定义正整数k为天使的阶数,k阶天使每步可以跳到k*k范围内的任何一格,无论路上有没有障碍物。

图1 蓝色虚线框内为3阶天使的移动范围|图源维基百科[1]

每一轮中,恶魔可以在棋盘上放置一个障碍物,但不可放在当前天使所在的位置,而天使可以移动到范围内未被放置障碍物的任何一处。若在一轮中,天使无法移动,则恶魔获胜。如果天使能无限地继续游戏,则天使获胜

康威已经证明[2](虽然他说是该书的共同作者伯利坎普展示给他的),只要棋盘大小大于32*33,k=1的情况下恶魔是必胜的。

为方便展示,这里将格点化为方格。如图2所示是一个33*33的棋盘,天使起始位于红色方格。无论天使开局怎么走,恶魔前8步只需将棋盘四周的8个黑格填上障碍物,这时天使必然位于中间的蓝色区域内,距离接触包围圈还有7步。

图2 1阶情形恶魔必胜|图源自制

而无论天使向哪个方向逃,恶魔都可以隔一格放一个障碍物这样逐渐缩小缺口,保证在天使接触棋盘边缘之前将缺口堵上,因此恶魔是必胜的。

一阶的天使问题告诉我们,只要棋盘足够大,让我们可以提前布置好包围圈,就一定能围住天使。而且天使问题中的棋盘是八连通的,即天使向横竖斜八个方向都可以移动,所以布置一个包围圈至少需要八步。而围小猫中的棋盘是六连通的,因此包围圈只需要6步。我们定义猫猫从空白棋盘中心逃脱的最少步数为棋盘的深度n,可以看到,围小猫游戏的棋盘深度为5。

图3 游戏棋盘的深度为5

丰富的游戏经验告诉我,n=5显然是不够的。如果要保证必胜,像天使问题里一样布置一个包围圈至少需要6个障碍物,也就是6步。因为猫n步就会逃出棋盘,而我们必须在猫逃脱之前花至少一步堵住逃脱的方向,所以棋盘的深度n至少应该为6+1+1=8。那么棋盘需要有多大才能保证必胜呢?答案就是n=8[3]。图中偶数号格点为我方放的障碍物,奇数号格点依次为猫猫的行动轨迹,可以看到这种情况下,我方是必定获胜的。

图4 n=8时的必胜策略|图源知乎[3]

所以,只要棋盘的深度不小于8,即使是一个空白的棋盘,我们也是必定可以围住小猫的。相应地,在没有障碍物的情况下,棋盘深度小于8时我们是不可能围住小猫的。

那 么,有 障 碍 物 呢?

终于回到了我们最初的问题:如何在一个n=5的棋盘上利用已有的障碍物围住猫猫。其实这里的思路还是一样的,那就是:先用若干步布置一个包围圈,然后通过围堵来完善包围圈。唯一的不同是,由于棋盘不够大,我们必须利用已有的障碍物来布置包围圈。和棋盘的深度一样,我们定义包围圈的深度为猫猫逃出包围圈的最少步数。很显然,包围圈越深,留给我们布置防线的步数就越多。

先来研究一下包围圈应该是什么样子的:包围圈应当是六边形,与棋盘形状相同,且每条边都经过每个经过格点的圆心,不允许斜着直接连。只有包围圈的每个顶点(如下面图6中的1-6号点)或者与该顶点相邻且在包围圈上的格点(如下图6中的7-15号点)有障碍物,才能起到挡住猫猫的效果。如果上述位置没有障碍物的话,就无法保证在猫猫被追赶到此处时闭合包围圈。

图5 红色连线没有经过所有经过格点的圆心,是错误的斜连。上面的深蓝色折线是正确的连法

如果一个顶点或与其相邻且在包围圈上的格点上有障碍物,我们就称这个顶点已完成,定义一个包围圈的完成度为已完成的顶点数量。下面我们举一个例子来说明。

图6 一个包围圈的例子

图6是一个包围圈的雏形,可以看到1,2,11,4,5号点都有障碍物,他们对应的顶点都已完成。但它并不是一个完整的包围圈,因为顶点6是未完成的。如果猫猫从右上往左上逃,我们堵住8号点后猫猫会逃至16号点,此时6,7两点均空,猫猫逃脱。顶点5虽然有障碍物,但它本身也是一个顶点,不能算作顶点6的相邻点。所以这个包围圈的完成度是5。

从棋盘深度为8的情形我们可以知道,在包围圈完成,即完成度为6时,如果猫猫距离包围圈至少有2格,我们根据猫猫的位置放障碍物来围堵就可以必胜。也就是说,必胜条件是包围圈深度+包围圈完成度至少为8。所幸,上图中的猫猫距离包围圈有3格,也就是说包围圈的深度是3,如下图所示,我们只需补上包围圈里缺失的点,就可以保证必胜。这就是看过本文的我们,第一步落在看似不需要优先围堵的6号点的原因。下面图7展示了图6例子中围猫的必胜方法。

图7 图6的必胜方法

需要注意的是,画包围圈也是有技巧的。比如下面这个图8就有AB两种画圈的方式,且包围圈的完成度均为5。如果按照红色的A方案规划4,5号点之间的包围圈,则包围圈的深度为2,5+2<8,无法围住猫猫。如果按照蓝色的方案B,则包围圈的深度为3,5+3=8,可以围住猫猫。所以画圈的方式也是很重要的哦!

图8 两种不同的包围圈方式

然而,由于游戏条件的限制,初始只有6-8个障碍物,棋盘深度也只有5,所以大多数情况下都是无法必胜的,如果想围住小猫,就多多地刷新吧!

不过,实际上游戏里的这只小猫并不太聪明,它的逃脱逻辑只是一个单层的贪心算法:只考虑当前看来是最好的逃脱路线。所以我们可以利用这点设下陷阱,诱导猫猫走出多余的步数,从而赢下无法必胜的棋盘,有兴趣的读者朋友一定要去试一试哦。

围 住 猫 猫 的 秘 诀!

最后,让我们总结一下围住猫猫的秘诀吧!只需要简单的三步哦。

第一步:根据已有的初始障碍物划定包围圈,在保证有尽可能多顶点被完成的前提下,让包围圈的深度尽可能地大。

第二步:判断包围圈完成度+包围圈的深度是否≥8?如果小于则无法保证围住猫猫,直接重置。

第三步:先将包围圈完成,然后对应猫猫所在位置进行围堵即可获胜。

写 在 最 后

还记得开头说的天使问题吗?这个问题其实并没有被完全解决。目前在天使的阶数k比较小,比如k=2的时候,数学家已经证明天使在无限大棋盘上是必胜的,但是对于任意有限阶的天使,哪方能必胜这个问题尚无答案。也许,能够解决这个问题的就是聪明的你。解决不了也没关系,至少,你学会如何抓住猫猫了,对吧?

参考文献:

[1]维基百科 天使问题

[2]John H. Conway, The angel problem, in: Richard Nowakowski (editor) Games of No Chance, volume 29 of MSRI Publications, pages 3–12, 1996.

[3]曾加的回答 - 知乎

封面来源搜狐网,表情包来源网络

编辑:fiufa

我们是谁:

MatheMagician,中文“数学魔术师”,原指用数学设计魔术的魔术师和数学家。既取其用数学来变魔术的本义,也取像魔术一样玩数学的意思。文章内容涵盖互联网,计算机,统计,算法,NLP等前沿的数学及应用领域;也包括魔术思想,流程鉴等魔术内容;以及结合二者的数学魔术分享,还有一些思辨性的谈天说地的随笔。希望你能和我一起,既能感性思考又保持理性思维,享受人生乐趣。欢迎扫码关注和在文末或公众号留言与我交流!

扫描二维码

关注更多精彩

对称与魔术初步(五)——刘谦经典魔术《幻境》

你眼中的魔术,也是美的吗?

聊一聊数学中的基本定理(五)——主定理

Gilbreath原理中的数学与魔术(九)——Max Maven作品选

魔术的逻辑(三)——明明是假的,但为何奇迹依旧美妙?

点击阅读原文,往期精彩不错过!

围住一只猫猫需要几步?【多猫预警】相关推荐

  1. SAP WM LT15不能取消二步法确认场景中只做过第一步确认的TO单

    SAP WM LT15不能取消二步法确认场景中只做过第一步确认的TO单 1,如下TO 需要2步法确认,TO#3000006418 看其确认状态时黄色三角形状态,说明第一步确认(LT1D)已经被业务人员 ...

  2. 只需十四步:从零开始掌握 Python 机器学习(附资源)

    分享一篇来自机器之心的文章.关于机器学习的起步,讲的还是很清楚的.原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找 ...

  3. mysql插入数据返回主键值_Mysql千万级别数据批量插入只需简单三步!

    第一步:配置my.ini文件 文件中配置 bulk_insert_buffer_size=120M 或者更大 将insert语句的长度设为最大. Max_allowed_packet=1M Net_b ...

  4. 通过历史控制文件恢复Oracle数据库,只需这10步

    墨墨导读:通过历史控制文件恢复数据库,只需这10步. 1. 记录控制文件.数据文件头的scn SYS@enmo>select checkpoint_change# from v$database ...

  5. 搭建公司内部论坛 只需简单三步 1 (安装Discuz)

    系列文章 ​​​​​​​搭建公司内部论坛 只需简单三步 1 (安装Discuz) 搭建公司内部论坛 只需简单三步 2 (发布Discuz) 随着公司快速发展,人员也越来越多,但员工人数多也会带来问题, ...

  6. android代码实现手机加速功能,神奇的安卓手机提速方法 只需设置两步立即提速70%以上...

    原标题:神奇的安卓手机提速方法 只需设置两步立即提速70%以上 6月份各大国产手机品牌相继推出自己的旗舰机,尤其是vivo前几天发布了屏占比高达91%的vivo NEX手机,而接下来OPPO也要发布F ...

  7. 本地ping不上虚拟机地址? 只需简单几步即可

    本地ping不上虚拟机地址? 只需简单几步即可 问题描述 解决方案 问题描述 虚拟机安装好之后,想要用Xshell连接却连接不上,然后就用本地的cmd窗口进行ping虚拟机测试,发现ping不通 如下 ...

  8. 给创维电视装鸿蒙,只需简单几步,创维老电视瞬间变超清智能电视!

    原标题:只需简单几步,创维老电视瞬间变超清智能电视! 创维电视作为国内电视的"老大哥",无论是传统的大屁股创维电视,还是新型的液晶创维电视在十年前可以说是家家必备,但是随着智能电视 ...

  9. 只需简单几步 - 开始玩耍微信小程序

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

最新文章

  1. UDP实现全双工聊天(聊天工具进阶)pyhton
  2. hive 简单操作搜狗实验室的词频文件
  3. React开发(280):moment处理日期
  4. okHttp记录---response.body().string()输出的结构是乱码
  5. 模型师对初学者的经验之谈
  6. Java中代理的简明使用
  7. jQuery使用最广泛的javascript函数库
  8. 【简单】Linux 搭建 UOJ
  9. matlab画图函数双精度,Matlab中图像函数大全2_matlab函数大全
  10. T3及报税软件报表使用无线打印机打印凭证没反应
  11. Android 项目使用 Jenkins 打包时的异常问题 AAPT: C:\Windows\System32\config\systemprofile\.gradle\caches
  12. EXCEL数组公式求解一定条件下的最大值及最小值
  13. 列出Excel所有sheet名称
  14. 通过ip地址查询远程服务器系统,通过ip地址查询远程服务器系统
  15. JB的产品之旅-产品经理是干嘛的?
  16. 炸掉你的城堡!(pygame獾兔大战)
  17. v-for与v-if可以一起使用吗?如果同时使用v-for和v-if会存在什么样的问题?
  18. C语言倒序输出/C语言倒置输出
  19. 迪米特法则——面向对象设计原则
  20. 海尔张瑞敏的十三个观点

热门文章

  1. Spring、Struts2+Spring+Hibernate整合步骤
  2. python可视化的优势_「数据可视化」数据可视化的优势有哪些?
  3. EmguCv几种图像打开方法和转换
  4. Redis 源码解读之 Rehash 的调用时机
  5. Golang的压测工具 hey
  6. 最小化最大链路利用率
  7. ubuntu与centos哪个更适合做服务器。
  8. plsql无法连接linux下的oracle服务器,提示:ora-12541:TNS 无监听程序
  9. 关于Catalan(卡特兰)数的理解
  10. 多个域名指向同一个网站实现方法