15puzzle玩法简介

15puzzle,也叫做15谜,15游戏。它的初始状态是由1到15共15个数字以及一个“空白”(以下简称“#”)排列在4*4的方格上,其中数字任意排列在前15个方格上,而“#”在最后一个方格上。玩家可以选择“空”上下左右四个方向的数字,并让这个数字与“空”交换位置。

所谓复原,指的是当这个4*4的方格从左到右,从上到下依次为1~15这15个数字加上一个最后面的”#“,这时候玩家胜利。

例如,这是一个可解的15puzzle例子

15puzzle历史

15puzzle最早由美国纽约的一名邮差在1874年提出。1914年,一个叫Sam loyd的人出版了一本叫《Cyclopedia of Puzzles》的书,提出了14-15问题,即把已经完成的15puzzle中的14和15数字调换位置,其它的保持不变,就如下面这样。Sam loyd愿意把高达1000美刀的奖金送给能成功复原14-15问题的人。

你有办法把这个复原吗?更加一般化来说,给你任意一个15puzzle谜题,能保证有解吗?如果不能保证,判断依据又是什么?这就是本文章主要探讨的问题。

可解性分析

移动次数居然是偶数

首先我们发现,“#”在初始打乱状态处在第16个方格,在完全复原后仍然处在第16个空格。这说明,如果我们把“#”左移了u次,那一定也把“#”右移了u次,如果我们把“#”上移了r次,那一定也把“#”下移了r次。上移的次数和下移次数相等,左移次数和右移次数相等,才能让“#”回到原来的位置,也就是说,“#”被移动了偶数次,答案的移动步数应该是偶数。

置换什么的

仅知道移动次数是偶数还是不够的。接下来我们将要讨论交换格子,推数字这类的游戏中一般的规律。

假设我们有1~4共4个数字,这4个数字组成了一个有序集合X1= {1,2,3,4}。然后定义交换的方法,把这个集合中的数字换成同一个集合中另一个数字,既不重复也不遗漏。

其中方法y的意思是,把原集合中的1换成2,把2换成3,依次类推,那么得到的新集合就是为X2= {2,1,4,3}。

这儿的方法叫做“置换”,不过名字并不是我们纠结的重点。 我们发现,诶,置换y实际上是把1和2对调了位置,把3和4也对调了位置,而1,2和3,4之间居然互不影响,真是奇了怪了,不如把独立的交换叫做循环吧。(1,2)是一个循环,(3,4)是另外一个。于是置换y记作

y = (1 2)(3 4)

同理,记作:

z = (1 2 3 4)

假设集合X1中元素的个数为n,某置换的循环的个数是t,若n-t为偶数,那么这个置换就是偶置换,否则是奇置换。嗯,y是偶置换,z是奇置换。

1000刀的奖金花落谁家?

再次回到移动次数分析。其实每次移动,就是一次置换啊,例如把第16个位置上的#与第十五个位置上的“6”交换,我们可以记作(6  #)。

之前已经说过,为了游戏胜利,我们要移动偶数次,移动过程互不影响,那么也就是偶数次循环。诶,偶数次循环,我们的集合中元素个数为16,也是偶数个,偶数减偶数还是偶数,这不就是证明我们要找的答案,也是偶置换吗?

这下,我们可以说,如果一个15puzzle的游戏(初始“#”在第16个格子)有解,那么它的解法一定是偶置换,如果分析出要把某个15puzzle的解法是奇置换的话,那么它一定是不可解的。

回到sam loyd的那个14-15问题。如果我们要把它复原,必须只进行一次置换,也就是只交换(14,15),这是奇置换。但是为了让“#”号在复原后仍然在第16个格子,我们必须移动偶数步,来个偶置换。奇偶不可兼得,那1000块奖金自然是谁也别想拿到了。

头图那个例子

不是封面图,是第一段玩法简介里的那个图,以下简称头图。那我们再用不容置疑的置换的眼光,看看15puzzle的解法究竟是怎样的。以头图为例,按从左到右,从上到下的顺序,解法其实就是下面一个置换y:

我们要做的,就是把上面一行的初始混乱状态,置换为下面一行的有序胜利状态。虽然这个置换y不符合游戏规则,但我们可以把它改得符合游戏规则啊!不过现在先不急。

看看置换y,我们可以记作

y = (1 5 6 15 4 7 11 3)(2)(12 8 14 10)(#)

先解释一下,(2)的意思就是2和2交换,当然就是保持原样了。(12 8 14 10)的意思是,12到8的位置,8到14的位置,14到10的位置,10到12的位置。解释完毕。

我们惊讶的发现,要使头图的例子复原,也得弄4个循环,16-4 = 12,也就是偶置换。答案要求的也是偶置换,诶是不是说明了什么?头图的例子很有被解开的前途啊。

不过等等,答案要求的解法,每次只能交换2个元素。而置换y一下交换好几个,违反规则了啊。正如之前所说,我们可以把它改成每次只交换两个元素的啊。

再悄悄定义一下

我们很快就要解决15puzzle啦!我们把刚才说得奇偶置换重新解释一下。

在集合Sn中,有一置换a内有t个循环,则sgn定义为

sgn(a) = (-1)n-t

嗯,那么当sgn(a) = -1的时候,a就是偶置换,当sgn(a) = -1的时候,a就是奇置换。 然后是一个定理对集合Sn上的两个置换a和b,我们有分解的方式:

sgn(ab) = sgn(a)sgn(b)

再假设τ是一个“对换”,即只交换两个元素的置换,例如之前说到的(6 #),就是对换。 那么

sgn(τa) = sgn(a)

这个也很容易理解,偶置换多加一个循环就是奇置换,奇置换多加一个循环就是偶置换。当然,每个对换也是奇置换。

祭出最后一个推理:

游戏规则规定答案必须是对换,也就是一次交换两个元素。之前我们证明了答案的的步数是偶数,当然就是偶数个对换,那么,我们只要证明,在头图的例子中,作为偶置换的置换y,分解成对换后也是偶数个对换不就行了嘛?

设置换a可以分解成q个对换τ1.....τq,那么

sgn(a) = sgn(τ1)....sgn( τn) = (-1)q

若a是偶置换,那么sgn(a) = 1,即q是偶数。因为每个对换都是奇置换,所以偶数的奇置换就当然偶置换啦,也就说,偶置换分解成对换后,就是是偶数个对换的积。

你知道我要说什么了吧?

那么,对于标题的问题来说,答案就撂这儿了:

设初始位置上,第1到15格分别是变量a1,a2....an,第16格为“空白”,记作“#”。

为了让数字复原,必须进行的下面这个置换

如果为偶置换,那么这个15puzzle是可解的。如果是奇置换,不好意思,一边凉快去吧。

结语

如果你能看到这儿,恭喜你,抽象代数的内容你已经了解一点了。除了15puzzle,相似的8puzzle问题可解性证明也是一样的。

嗯,现在你可以给小伙伴出个解不出来的15puzzle,然后一边吃瓜一边看你的小伙伴满头大汗了。所以在你的小伙伴也看到这篇文章之前,尽情为所欲为吧!。

参考

15谜 问题java_15puzzle(15谜)可解性背后的数学原理相关推荐

  1. 解析深度神经网络背后的数学原理!

    作者 | Piotr Skalski 译者 | 巧克力 编辑 | Jane 出品 | AI科技大本营 [导读]为了更好地理解神经网络的运作,今天只为大家解读神经网络背后的数学原理.而作者写这篇文章的目 ...

  2. 人工神经网络背后的数学原理!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:贾博文,浙江大学,Datawhale原创作者 本文约8000字,建 ...

  3. 梯度下降背后的数学原理几何?

    来自 | 深度学习这件小事   编辑 | Datawhale 对于诸位"机器学习儿"而言,梯度下降这个概念一定不陌生,然而从直观上来看,梯度下降的复杂性无疑也会让人"敬而 ...

  4. 模拟上帝之手的对抗博弈——GAN背后的数学原理

    模拟上帝之手的对抗博弈--GAN背后的数学原理 深度学习 人工智能 机器学习 神经网络 神经网络与机器学习-英文版 阅读1984  作者:李乐 CSDN专栏作家 简介 深度学习的潜在优势就在于可以利用 ...

  5. 一文读懂梯度下降背后的数学原理几何

    (给视学算法加星标,修炼编程内功) 来源:AI科技评论 对于诸位"MLer"而言,梯度下降这个概念一定不陌生,然而从直观上来看,梯度下降的复杂性无疑也会让人"敬而远之&q ...

  6. RSA 公钥密码系统背后的数学原理

    介绍 RSA 是一种非对称的公开密钥算法,它需要一对公钥和私钥,消息发送者使用公钥对消息进行加密,消息接收者使用私钥对消息进行解密.这个算法的特殊之处在他的加密.解密算法和公钥都是公开的,只有私钥是保 ...

  7. 深入卷积神经网络背后的数学原理 | 技术头条

    参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑ 作者 | Piotr Skalski 译者 | Monanfei 编辑 | 十月Rachel.Jane 出品 | AI科技大本营(id:rgzn ...

  8. 【深度学习】解析深度神经网络背后的数学原理

    来源:产业智能官 解析深度网络背后的数学 如今,已有许多像 Keras, TensorFlow, PyTorch 这样高水平的专门的库和框架,我们就不用总担心矩阵的权重太多,或是对使用的激活函数求导时 ...

  9. 深入卷积神经网络背后的数学原理

    来源:AI科技大本营 摘要:在计算机神经视觉技术的发展过程中,卷积神经网络成为了其中的重要组成部分,本文对卷积神经网络的数学原理进行了介绍. 文章包括四个主要内容:卷积.卷积层.池化层以及卷积神经网络 ...

最新文章

  1. Facebook开源最大规模并行语料,45亿语料,覆盖576种语言对
  2. C++ Vector的使用
  3. 怎么让图片手机上排列_PS手机卷轴样机,分分钟让图片变得高大上!
  4. 解决:-bash: unzip: command not found (Linux 中 unZip/Zip 的安装及使用)
  5. Oracle的逆向工程generatorConfig
  6. ROS推荐链接:UNIX/LINUX专为初学者的教程和命令 http://www.ee.surrey.ac.uk/Teaching/Unix/
  7. 拖动精灵的三种方法比较
  8. java weblogic admin,weblogic admin 不能重起服务(Server may already be running)
  9. Hystrix断路器
  10. php 61850,基于IEC61850智能电子设备(IED)系统解决方案.PDF
  11. 关于C语言从键盘输入内容到数组
  12. 关于视频播放的断点续传实现(.NET)
  13. python中out函数_Python中函数的使用
  14. 浅谈人工智能发展现状及未来挑战
  15. java版QQ 欢迎点评
  16. EasyExcel 中文文档
  17. 【每日早报】2019/10/10
  18. RX6900XT和RTX3080哪个好
  19. 【转】我的助理辞职了!
  20. Taylor formulation

热门文章

  1. echarts legend 图例与文字对齐问题
  2. 【零基础学习开发FlappyBird】初遇困难之如何解决小鸟转弯飞
  3. 【Windows】程序界面不显示在屏幕上
  4. 基于arduino的wifi自动开门装置(Arduino)
  5. Golang 实现依赖注入
  6. OpenStack 是什么?
  7. pdf文档怎么转换成excel?分享这几个方法!
  8. nightwatch系列教程02——开发者指南:使用Nightwatch
  9. 实例方法 类方法 静态方法
  10. java 汉明距离_Java实现 LeetCode 461 汉明距离