判断N 数码是否有解 牛人总结 归并排序

2023-05-16

 作者:力的博客

 

先介绍八数码问题:

我们首先从经典的八数码问题入手,即对于八数码问题的任意一个排列是否有解?有解的条件是什么?

我在网上搜了半天,找到一个十分简洁的结论。八数码问题原始状态如下:

1 2 3
4 5 6
7 8

为了方便讨论,我们把它写成一维的形式,并以0代替空格位置。那么表示如下:

1 2 3 4 5 6 7 8 0

通过实验得知,以下状态是无解的(交换了前两个数字1 2):

2 1 3 4 5 6 7 8 0

八数码问题的有解无解的结论:

一个状态表示成一维的形式,求出除0之外所有数字的逆序数之和,也就是每个数字前面比它大的数字的个数的和,称为这个状态的逆序。

若两个状态的逆序奇偶性相同,则可相互到达,否则不可相互到达。

由于原始状态的逆序为0(偶数),则逆序为偶数的状态有解。

也就是说,逆序的奇偶将所有的状态分为了两个等价类,同一个等价类中的状态都可相互到达。

简要说明一下:当左右移动空格时,逆序不变。当上下移动空格时,相当于将一个数字向前(或向后)移动两格,跳过的这两个数字要么都比它大(小),逆序可能±2;要么一个较大一个较小,逆序不变。所以可得结论:只要是相互可达的两个状态,它们的逆序奇偶性相同。我想半天只能说明这个结论的必要性,详细的证明请参考后面的附件。

>推广二维N×N的棋盘

我们先来看看4×4的情况,同样的思路,我们考虑移动空格时逆序的变化情况。

1 2 3 4
5 6 7 8
9 A B C
D E F

我们用字母A~F代替数字10~15。同样地,当左右移动的时候,状态的逆序不改变。而当上下移动的时候,相当于一个数字跨过了另外三个格子,它的逆序可能±3或±1,逆序的奇偶性必然改变。那么又该如何

1 2 3 4
5 6 7 8
9 A B
C D E F

可以证明,以上状态是一个无解的状态(将C移到了第四行)。该状态的逆序为0,和原始状态相同,但是它的空格位置在第三行。若将空格移到第四行,必然使得它的逆序±1或±3,奇偶性必然改变。所以它是一个无解的状态。

然而以下状态就是一个有解的状态(交换了前两个数字1 2):

2 1 3 4
5 6 7 8
9 A B
C D E F

这个状态的逆序为1,和原始状态奇偶性不同,而空格位置在第三行。由于空格每从第三行移动到第四行,奇偶性改变。则该状态的可到达原始状态。

通过观察,得出以下结论:

N×N的棋盘,N为奇数时,与八数码问题相同。逆序奇偶同性可互达

N为偶数时,空格每上下移动一次,奇偶性改变。称空格位置所在的行到目标空格所在的行步数为空格的距离(不计左右距离),若两个状态的可相互到达,则有,两个状态的逆序奇偶性相同且空格距离为偶数,或者,逆序奇偶性不同且空格距离为奇数数。否则不能。

也就是说,当此表达式成立时,两个状态可相互到达:(状态1奇偶性==状态2奇偶性)==(空格距离%2==0)。

此结论只是由观察得知的,但是还没证明过,请高手指点。

另外再详细说明一下,无论N是奇数还是偶数,空格上下移动,相当于跨过N-1个格子。那么逆序的改变可能为一下值±N-1,±N-3,±N-5 …… ±N-2k-1。当N为奇数数时N-1为偶数,逆序改变可能为0;当N为偶数时N-1为奇数,逆序的改变不能为0,只能是奇数,所以没上下移动一次奇偶性必然改变。

>推广到三维N×N×N

其实,三维的结论和二维的结论是一样的。

考虑左右移动空格,逆序不变;同一层上下移动空格,跨过N-1个格子;上下层移动空格,跨过N^2-1个格子。

当N为奇数时,N-1和N^2-1均为偶数,也就是任意移动空格逆序奇偶性不变。那么逆序奇偶性相同的两个状态可相互到达。

当N为偶数时,N-1和N^2-1均为奇数,也就是令空格位置到目标状态空格位置的y z方向的距离之和,称为空格距离。若空格距离为偶数,两个逆序奇偶性相同的状态可相互到达;若空格距离为奇数,两个逆序奇偶性不同的状态可相互到达。

讨论到这里,题目问题也就解决了。

另外水木清华BBS论坛中有人提到:

8数码难题搜索时,有时候是无解的,8数码问题总共有9!种状态,如果用计算机一
个一个去搜索去判断哪些有解哪些误解,无疑要花费很长的时间,也没必要。作为一种
智力游戏,玩之余,我在想,能否通过事先的分析来判断哪些问题有解,哪些问题无解
呢?对于有解的问题,是否能通过一种固定的步骤来得到解?经过昨天晚上和今天的仔
细分析,我觉得我已经得到了这个问题的初步解答,下面我公布一下我得到的结果和证
明,抛砖引玉,如果大家发现其中有什么问题,欢迎来我宿舍一起讨论或者给我发Emai
l。
我的证明分好几个步骤,恳请大家能够耐心的看下去,我会尽量说得简洁一点。

一、我的结论
我们将九宫格按行排成一行共九个数(空格也占一个位置,在本文种,我用@表示空
格)。比如: 1 2 3 4 @ 5 => 1 2 3 4 @ 5 6 7 8 6 7 8 这样
,九宫格的每一种状态和上图的行之间是一一对应的。在代数上册我们学过逆序的概念
,也就是对于任意一对数,如果前面的数比后面的数大,则为一对逆序。对于一个序列
,我们定义其逆序奇偶性如下: 如果其中有奇数对逆序,称之逆序奇;如果其中有
偶数对逆序,称之为逆序偶。这样,对于1,2,...,n这n个数,其所有的排列可以分为
两类,逆序奇类和逆序偶类。相对应的,九宫图(除去空格)也有它的奇偶性,我们的定
理是:
所有的奇九宫图之间是可达的,所有的偶九宫图之间也是可达的,但奇九宫图和偶
九宫图之间互不可达。

二、问题的转化
为了证明上述定理,我想先对问题进行一下转化。我定义两种行序列的变换:一种
是空格@和相邻的数对换,一种是空格@和前后隔两个数的数之间的对换,前者对应着空
格在九宫图中的左右移动,后者对应着空格在九宫图中的上下移动。

引理一:在上述的两种对换下,序列的奇偶性不改变。 这个引理很容易证明。
首先,相邻的对换肯定不改变奇偶性;其次,隔两格的对换也不改变奇偶性,它相当于
三个数的轮换,我们可以自己列举一下几种情况验证一下。这就说明了奇九宫图和偶九
宫图之间是互不可达的。

引理二:转化后行序列在上面定义的两种对换下的任意操作,可以转换成九宫图中
空格的合法变化。 这个引理也是比较容易证明的。我们只要证明如下的几种状态之
间是互达的: a b c a b @ a b ca b c@ d e <=>
c d e d e f <=> d e @ f g h f g h @ g hf
g h 通过计算机搜索,可以发现上面两对状态之间的确是互达的。从而,我们可以
假定上面两种状态之间的转换可以用行序列中的两种邻对换来代替。
想提一点的是,九宫图之间的变换是可逆的。下面,到了问题的核心部分了。

引理三:所有的奇状态可以转换为 @ 1 2 3 4 5 6 7 8, 所有的偶状态
可以转换为 @ 2 1 3 4 5 6 7 8. 要证明这个引理,得分几个步骤。我的想法是先设
法把8移到最后一个,然后8保持不动(注意,我们这里的不动只是形式上不动,但不管怎
样,我们的每一个变换后,8还是保持在最后一个,余类似),再将7移到8之前,然后,
保持7和8不动,依次移动6,5,4,3,得到 * * * 3 4 5 6 7 8这里 * * *是 @ 1 2 的
一个排列。到这里,我想要得到前面的两种状态之一是显然的了。下面,我说明,上面
的想法是可以实现的。如下:
1. 对于 a b c @ ,我们可以将其中的任意一个移到
最后,并且对变换仅限于这四个位置上。显然,对于a,c是一步就可以做到的。对于b,
步骤如下: a b c @ -> @ b c a -> b @ c a -> b c @ a -> b c a @ -> @ c a b
2. 先把要移到最后位置的那个数移到最后四个位置之一,然后再将空格移到最后一
个位置,用1的方法将待移动的数变换到最后一个位置。循环这样做即可。 引理三证
毕。

证完了这三个引理,定理的成立就是显然的了。首先,将奇偶性相同的两种状态都
变换到上述两种标准状态之一,然后对其一去逆变换即可。以上是我的所有证明,有些
地方在计算机上写起来不是太清楚。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断N 数码是否有解 牛人总结 归并排序 的相关文章

随机推荐

  • win10 操作系统JDK 11安装配置环境变量

    JDK 11的安装说明Installation of the JDK on Microsoft Windows Platforms 1 系统变量 新建 JAVA HOME 变量 变量值填写jdk的安装目录 xff08 2 xff09 系统变
  • Linux学习--Shell脚本的创建

    Shell脚本的创建 1 什么是shell shell 它是命令行解析器 xff0c 分为以下几类 xff1a 1 sh xff1a 全称 Bourne Shell 是UNIX最初使用的 shell xff0c 而且在每种 UNIX 上都可
  • Linux磁盘扩容三种方式

    Linux在使用过程中由于数据量不断增大 xff0c 导致磁盘空间不足 xff0c 需要增加磁盘空间 xff0c 主要有以下三种方式 1 直接给 分区 xff08 或者某一分区 xff09 扩容 xff0c 直接在原有磁盘上增大空间 2 给
  • Ubuntu系统电脑屏幕合盖后 在打开,进入不了系统(黑屏幕)

    一 编辑下列文件 xff1a sudo vim etc systemd logind conf 打开文件输入 xff1a i 然后才能修改 xff1b 修改完成后 xff0c 按 Esc 键 然后输入 34 xff1a wq 34 Ente
  • 【森气杂谈】群晖NAS内外网磁盘映射以及quick connect设置

    森气杂谈 群晖NAS内外网磁盘映射以及quick connect设置 NAS内网磁盘映射具体操作步骤 NAS外网磁盘映射具体操作步骤 quick connect NAS内网磁盘映射 在频繁使用NAS时 xff0c 网页版体验确实不是很好 x
  • 大数据-HDFS的定义、使用场景、优缺点、组成架构

    HDFS定义 HDFS Hadoop Destributed File System 是一个分布式的文件系统 xff0c 用于存储文件 xff0c 通过目录树来定位文件 HDFS使用场景 适合一次写入 xff0c 多次读取的场景 xff0c
  • 获取当天时间相关时间(凌晨、第二天凌晨)

    方法一 xff1a 通过毫秒数获取当天时间相关信息 当前时间毫秒数 long current 61 System currentTimeMillis 今天零点零分零秒的毫秒数 long zero 61 current 1000 3600 2
  • 2021-03-22

    Description 辗转相除法 xff0c 也称欧几里得算法 xff0c 是求最大公约数的算法 辗转相除法首次出现于欧几里得的 几何原本 xff08 第VII卷 xff0c 命题i和ii xff09 中 xff0c 而在中国则可以追溯至
  • 如何禁止.exe文件运行?

    开始 61 gt 运行 61 gt gpedit msc计算机配置 61 gt Windows设置 61 gt 安全设置 61 gt 软件限制策略 61 gt 右击 34 其他规则 34 61 gt 新建路径规则 61 gt 浏览到你要禁止
  • 将FTP文件夹映射到电脑本地使用,无需每次输入用户名及密码

    1 在资源管理器中 xff0c 右键我的电脑 xff0c 选择 添加一个网络位置 如图 右键我的电脑 2 下一步 xff0c xff08 如果本机未连接到因特网会有弹窗提示点击取消即可 xff09 xff0c 选择自定义网络位置 xff0c
  • 涂鸦智能设备接入homeassistant

    本文介绍怎么把涂鸦智能家居产品本地局域网接入开源智能家居平台homeassistant 1 手机端安装 涂鸦智能APP并添加好涂鸦智能家居产品 xff1b 2 打开第三方应用插件商店 HACS 下载local tuya插件 xff0c 重启
  • jdk版本问题(Unsupported major.minor version 52.0)

    在开发的时候遇到jdk版本不兼容的时候很闹心 xff0c 本来东西在自己的电脑 xff0c 自己的tomcat上都很正常 xff0c 但是把接口的导成war包发布给实施的时候 xff0c 就出现了问题 xff0c 之后实施的这群人真是啥也不
  • Home Assistant添加第三方zigbee网关来管控不同厂家的zigbee设备

    ZigBee 是一种 短距离 低功耗的无线通信协议 xff0c 广泛应用于物联网 xff0c 它 最大的优势是可以自动组网 xff0c 将信号范围内支持该协议的各设备连接到一起 xff0c 在这个自组网络中需要一个中心节点设备来管理整个Zi
  • windows系统整机迁移 克隆到新电脑 原来的应用软件都还在 无需重新安装

    固态硬盘 xff08 SSD xff09 的 存 取 速 度 快 xff0c 用 它 来 安 装 操 作 系 统 xff0c 对 电 脑 性 能 的 提 升 效 果 十分 明 显 xff0c 而 重 装 操 作 系 统 后 需 要 重 新
  • 虚拟服务器集群新建linux虚拟机模板操作步骤

    本文以新linux系统Ubuntu22 04为例 第一步 xff1a 上传镜像 第二步 xff1a 创建虚拟机 第三步 xff1a 安装操作系统 第四步 xff1a 将虚拟机转换成模板 第五步 xff1a 用模板创建虚拟机 第一步 xff1
  • 虚拟机安装教程 VMware Workstation 16 Pro

    VMware虚拟机能干什么 xff1f 它可以使你在一台机器上同时运行两个及以上的Windows LINUX系统 系统切换真正的秒切 xff01 你可以用虚拟机来进行各种测试或实验而不会影响到你的物理实体机 xff0c 极其方便 xff0c
  • Raspberry PI 外壳 铝合金支持Raspberry PI 3B+ & PoE HAT

    HOTe RPA 铝合金外壳 完美搭配最新的Raspberry PI 3B 43 amp PoE HAT en 题外话 最近 xff0c 随着3D软件的应用越来越熟练 xff0c 对于电子外壳的设计也越来越得心应手 最近的几个项目设计 xf
  • 有符号整数的移位操作(按其补码移位规则进行操作)

    知识点 算法运行时 xff0c 输入的整数 默认 情况下被计算机系统表示为 有符号整数 有符号整数的二进制表示中 xff0c 最高位为符号位 xff08 正整数为0 xff0c 负整数为1 xff09 xff0c 这也是有符号整数名称的由来
  • 判断是否为回文字符串 ← 栈

    问题描述 所谓 回文字符串 就是指正读反读均相同的字符序列 如 123a321 和 aba 均是回文 xff0c 但 abc 不是回文 通过 栈 这个数据结构我们将很容易判断一个字符串是否为回文 算法代码 include lt bits s
  • 判断N 数码是否有解 牛人总结 归并排序

    作者 力的博客 先介绍八数码问题 xff1a 我们首先从经典的八数码问题入手 xff0c 即对于八数码问题的任意一个排列是否有解 xff1f 有解的条件是什么 xff1f 我在网上搜了半天 xff0c 找到一个十分简洁的结论 八数码问题原始