有时,小编回忆起童年和青春,眼前总是浮现出一片碧蓝碧蓝的天空和嫩得出水的草地,以及以前在那上面和小伙伴们度过的愉快的时光……
当然,你们别想错了
我说的蓝天和草地是指这个 ��
为了防止被打小编选择提前爆头蹲防
Windows XP 确实承载很多的记忆,而且 XP 这个系统也是真的经用。Windows XP 于 2001 年 8 月 24 日正式发布,微软在2014 年 4 月 8 日才停止了对 Windows XP 桌面版系统的支持服务,一直到这周二,2019 年 4 月 9 号,运行在嵌入式设备上的最后的一批 Windows XP 才失去微软的官方支持。XP 们终于正式对我们 say goodbye 了。[1]
经典的扫雷游戏
提起 XP,不得不说操作系统自带的诸如扫雷,纸牌这一类的经典游戏真的经典,好玩又杀时间。如果可以统计全人类花在这上面的时间,估计肯定是一个天文数字。。。不过尽管扫雷大家玩的时间很长,玩的次数也很多,但是我猜 99% 的玩家肯定没思考过,自己玩扫雷为啥那么容易就死了。。。
对比一下别人家的孩子玩扫雷的速度
图片经过加速。如果你想看真正目前世界上扫雷最快的记录的话,可以去 [2] 围观
再看看自己玩扫雷的样子...
差不多就是这种水平,刚点到扫雷图标雷就已经炸了
虽然 XP 已经离我们而去,但是万幸的是 Win10 系统还能够在商店中直接搜索「minesweeper」下载官方重置了的扫雷游戏,重新体会以前的经典。
其实吧,扫雷这个游戏很多科学家也爱玩。不过一般人玩扫雷如果死得快,就不断重开重开重开直到碰到一个好的开局(然后又快速地死掉)。科学家就不一样,如果他们玩扫雷死得快,他们不会重开,他们会直接证明「这个游戏通关概率为 0」。
扫雷毕竟已经有这么长的历史了,分析扫雷游戏求解概率的论文都有一大堆。作为一个熟练点击扫雷重开键的手残扫雷玩家,今天我就来和大家系统地聊一聊扫雷的背后的故事。
扫雷秘籍
Minesweeping cheat sheet
天下武功,无坚不摧,唯快不破!
从数学上来看,扫雷就相当于一个不断给你已知条件不断求解的过程,就像一个不断增加条件的应用题。你可以通过左键点开确定不是雷的块,右键标记你认为是雷的区域。如果你点开的这一块不是雷,那么它会告诉你这块区域周围八格内有几颗雷。只要你点得足够快,雷就追不上你。
通过很简单的反证法,我们可以推出来很大一部分雷所在的位置。[3]
角落上的情形
所谓反证法,就是反过来想这个问题。如果存在这么一个向内凹的角,内部的都是空白,但是角落上是一个 1,那么这个角上一定会有一颗雷。因为如果这个地方再不是雷的话,那中间的 1 所指的雷就只能去流浪了。。。同理,一条边上如果有 3 的话,那和 3 挨着的这三个一定是雷。毕竟地雷兄弟们也不能挤一挤挪到一个格子上去。
位于边界时候的情形
除了这个反证法以外,在扫雷里还有很多固定的「套路」。学会这个套路,保证你扫雷功力大增,杀进小区扫雷五百强。
听起来好像很厉害的样子
在扫雷的时候其实经常会遇到一些固定的数字,比如三个连续的数字为121,此时想都不用想,就可以直接在121 两个 1 的正对方向标上雷。或者四个连续的数字1221,此时两个 2 的正对方向上也一定是雷。
121 情形下,由于左侧 1 的限制,在黄色区域内只能有一格雷,但是中间的 2 至少要求 2 格雷,所以粉色的那颗一定是雷。同理证明另外一侧
1221 情形下,和上面证明过程相同,由于 1 的限制导致在黄色区域内只能有 1 格雷,所以另一个 2 正对的方格一定是雷。
「小编小编,我有个问题,那 121221 呢?按照秘籍填雷的话中间那个 1 附近有两颗雷诶?」
似乎有问题的秘籍?
「这种情况是不可能的!左边数起三个 1 已经覆盖了上面的所有未知空格,所以地雷数至多只有 3 个。但下方显示地雷数为 1+2+2+1+2+1,在只有中间 5 个格子重复计数的情况下都到了 7,大于 3 的 2 倍。所以这种图形是不可能存在的!」
咳咳,把思路收回来,如上所述,扫雷确实是有一些套路的。每日熟读此扫雷秘籍,假以时日,扫雷技艺必将大成。
扫雷还是运气活
Lucky or not,it's a question
玩扫雷,你必须要接受,这是一款拼人品的游戏。
虽然人生已经如此地艰难,但我还是要无情地拆穿这一点。想必你此时已经熟练掌握了扫雷的套路,不过在有些时候你还是要面对猜雷这种事情,而且一招不慎,满盘皆输。。。
猜猜黄色部分的雷应该是怎么分布的?
图中黄色部分就是典型的需要猜的扫雷难题。根据角落里面的数字,我们都只能知道 1�2 的黄色部分里面一定只有一个雷,不过我们并不知道哪个才是雷。如果没有其它信息的话,我们辛辛苦苦大半个棋盘,最后通过这个地雷阵的概率还是只有1/8。
这种简单的判断还好,有些时候还会遇到一些藏得更加隐晦的猜的时候。
扫雷判断题
假设在我们的扫雷过程中遇到了这么一个图案,确实是一件欲哭无泪的事情。不知道怎么哭的可以先把眼泪准备好,小编马上就告诉你们为啥要哭。。。从左边开始,假设第一个空位有雷,那么第二个空位没有雷,因为空位中间 1 的存在从而第三个空位有雷,依次类推。但是如果是第一个空位没有雷,而第二个空位有雷,我们也说得通。都要踩地雷了,还整个这么复杂的难题,至于么。。。
别急,后面还有更加复杂的。这里的 x 和之后的 * 号上是否有雷的情况一直相同,所以这个地雷阵就像一根传递信号的导线一样。在扫雷的地图上,我们不仅仅能够做出这种简单的传递信号的导线,其实还能够实现所有的电子电路中的逻辑门的操作。[4,5]
非门电路
或门电路
这是两个「简单」的逻辑门,分别实现了将信号翻转的非门和将两路信号做或操作的或门。在另一个也很著名的沙盒游戏——《我的世界(Minecraft)》里面,玩家也可以通过游戏中的材料,红石(其实在此之前的 Windows 10 操作系统的每一年的更新代号就是用红石来命名),实现各种各样的复杂逻辑操作,更有玩家利用红石在 Minecraft 里制造出了真正能运行的计算机。。。
红石计算机,具有完整的寄存器,加法器等部件 [6]
算了,我已经不敢想象扫雷会变成什么样了。。。
判断有没有解都是一件很难的事情
Find solution
回到文章最开始,我们人去破解一个扫雷问题的话,很容易就会死掉了,那把这个问题交给计算机来做会怎么样?然而很遗憾的是,一般情况下,计算机目前对扫雷这个问题还是无能为力。。。
难过
稍微值得庆幸的是,在我们平时玩的比较小的棋盘下,计算机还可以通过搜索得到答案。
为了了解计算机处理问题难度的几个级别,有必要先知道一个概念——多项式时间。对于同一个算法,根据处理问题大小的不同,计算机一般来说需要不同的时间进行计算。用最直观的例子来说,小明要去洗衣服,他洗 1 件衣服的时间为 2 分钟,洗 5 件衣服的时间为 10 分钟,洗 10 件衣服的时间为 20 分钟,处理问题的时间随问题规模的变化为线性关系,一次多项式。现在我们假设小明还是要洗衣服,只不过现在的衣服比较特殊,他洗 1 件这种衣服的时间为 2 分钟,但洗 5 件的时间变为 32 分钟,洗 10 件的时间变为 1024 分钟,这个时候就是指数关系的,而不再是多项式了。评价一个算法,随着问题规模的增大,计算时间怎么增长是一个十分重要的指标。
在计算机里面,对于多项式级别的时间,我们还是认为很快的。如果把问题按照求解的难度来进行分类的话,P是指能够用多项式时间求解的问题,俗话说就是算起来很快的问题。NP是指算起来不一定快,但是任何答案我们都可以检查起来很快的问题。NP 完全问题,是比所有 NP 问题都要难的 NP 问题。虽然人们有个美好的想法,总觉得验算起来很快的应该可以找到办法让他算起来很快,但目前还是个未知数。。。[7]
很不幸,求解一个扫雷游戏的解,正好是一个 NP 完全问题——在能够轻松验证结果是否正确的问题里面最难的那一类。这一类问题目前为止人们还没有发现多项式时间的求解算法,通常只有指数级甚至阶乘级的搜索算法来解决。
用来显示液晶数字的逻辑电路。我们可以很方便地一个一个试,但是反过来却很难,尤其是在这个逻辑电路非常庞大的时候
扫雷游戏属于一个如此困难的问题,其原因就出在上一章提到的,可以把扫雷游戏看做一个个逻辑门进行运算的逻辑电路。给定一个逻辑电路,在已知输出结果的情况下,能否确定每个输入的值?这个问题被称为SAT 问题,是世界上第一个被证明其为 NP 完全的问题。[8]这种问题验证起来非常容易,你只需要把结果代入到逻辑电路中,马上能知道是否符合要求,但倒过来想要计算符合结果的输入就极端地麻烦。
求解扫雷游戏的结果,利用那些构造的逻辑门,恰恰等价于求解 SAT 问题。[9]
扫雷还和渗透有关系
Percolation
液体,图片来自 Giphy,Michael Shillingburg
其实我们在玩扫雷游戏的时候觉得很难,其实还有另外一个原因。这个原因和物理里面的渗透还有关系。
在上个世纪 60 年代,科学家们[10]发现在流体流过多孔的介质的时候,介质中的空洞总是会被堵塞,有时候就会影响流体流出。更为奇怪的是,当这些多孔的介质的孔隙被随机堵塞的比例逐渐增大而达到某一值时,一开始一直能够流动的流体就突然被完全堵住。在孔洞被随机堵住的概率发生变化时,液体流过的比率也会发生一个突变。
这种现象被称为逾渗(percolation)。[11]
遇到这种情况,你该怎么下手
在扫雷里面,也存在类似逾渗的现象。当一盘游戏里面的地雷密度特别低的时候,我们差不多随便点,都不会点到地雷,而是点到大片大片的空白,一下子就把问题解决了。但是当地雷密度增高以后,在增大到一定程度以后,即使我们理性地分析,从不瞎猜,也不可能把扫雷问题做对了。
针对不同的棋盘大小,有人计算了在不同地雷密度情况下获胜的概率。三角形对应的曲线为初级 8�8,正方形为 15�13,菱形为高级,30�16。这里的能否求解实际上不包括第一次随机点击的时候踩中雷的概率。[12]
我们把流体通过多孔介质逾渗的模型抽象出来的话,其实对应着点逾渗,也就是把整个介质想象成一个网络,流体在经过每个网格时,有概率 p 的可能通过。如果不能流过的网格在网络中连成了片,流体就不能流过了。
不严格地来说,求解扫雷问题其实和逾渗模型很类似,我们求解的过程其实也像推土机一样,不断地利用已有的知识将已知区域向外一层一层地推进。如果游戏中某处雷的密度越大,那么越有可能出现可解部分被雷分开的情况,地雷密度和逾渗参数起到了一样的作用。如果被分隔到无法连接整个棋盘,那就无法继续推理了。更为严格的证明可以参考 Elchanan Mossel 的论文。[13]
推土机,图片来自网络
随着网格的不断增大,这条胜率曲线中间部分也变得越来越陡峭,扫雷问题越来越向两个极端发展:要不就根本解不出来,要不就是很容易地就能解出来。在高级模式下,地雷的密度其实已经到了 99/480 = 0.2,能够解出来的概率已经不到 1/4,这还不算手抖了点错了,开局不好重开之类的情况,真的不算是友好了。
结 论
Conclusion
emoji 版本扫雷 [14]
相信看到这里的人
一定已经跃跃欲试想要玩一下扫雷了
我相信你们
天下无难事,只要肯放弃
卸载也行