八数码&十五数码问题探究
题目分析
下面给出八数码问题的题面, 比较简单易懂.
在一个 X
恰好不重不漏地分布在这
例如:
1 | 1 2 3 |
在游戏过程中,可以把 X
与其上、下、左、右四个方向之一的数字交换(如果存在)。
我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
1 | 1 2 3 |
例如,示例中图形就可以通过让 X
先后与右、下、右三个方向的数字交换成功得到正确排列。
交换过程如下:
1 | 1 2 3 1 2 3 1 2 3 1 2 3 |
把 X
与上下左右方向数字交换的行动记录为
u
、d
、l
、r
。
现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
输入格式
输入占一行,将
例如,如果初始网格如下所示:
1 | 1 2 3 |
则输入为:1 2 3 x 4 6 7 5 8
输出格式
输出占一行,包含一个字符串,表示得到正确排列的完整行动记录。
如果答案不唯一,输出任意一种合法方案即可。
如果不存在解决方案,则输出 unsolvable
。
输入样例:
1 | 2 3 4 1 5 x 7 6 8 |
输出样例
1 | ullddrurdllurdruldr |
十五数码问题和八数码问题类似, 不再赘述.
解的存在性
观察到, 把矩阵以层序遍历转化成包含
而每次移动, 一定会使序列减少/增加
所以对于特定的一种序列, 有解当且仅当该序列存在偶数个逆序对.
对于简单的八数码(3*3)
一般的目标状态是这样的(我们把矩阵表示为序列,0表示空格):
1 2 3
4 5 6
7 8 0
即:
123456780
对于每个状态定义一个逆序:除0以外的数字的逆序对数目
抛出结论:两个状态可以达,当且仅当两个状态序列逆序奇偶性相同
简单证明必要性:
对于空格的移动,左右移动不会影响逆序,上下移动导致被替换数字跨过两个数字,这两个数字可能都比它大,可能都比它小,可能一大一下,相应的对逆序造成的影响为:+2,-2,不变。因此得证。
对于N*N的矩阵
容易发现,N为奇数的时候与八数码问题相同
那么对于偶数:
譬如:N=4的时候:
对于空格的移动,左右移动不会影响逆序,上下移动导致被替换数字跨过3个数字,对逆序造成的影响为:+3,-3,+1,,-1。我们发现,奇偶性一定改变,不一定有解也不一定无解。
举个例子:
目标状态:
1 2 3 4
5 6 7 8
9 A B C
D E F 0
状态1(无解):
1 2 3 4
5 6 7 8
9 A B 0
C D E F
以上状态是一个无解的状态(将C移到了第四行)。该状态的逆序为0,和原始状态相同,但是它的空格位置在第三行。若将空格移到第四行,必然使得它的逆序±1或±3,奇偶性必然改变。所以它是一个无解的状态。
然而以下状态就是一个有解的状态(交换了前两个数字1 2):
状态2(有解):
2 1 3 4
5 6 7 8
9 A B 0
C D E F
这个状态的逆序为1,和原始状态奇偶性不同,而空格位置在第三行。由于空格每从第三行移动到第四行,奇偶性改变。则该状态的可到达原始状态。
通过观察发现,得出结论:
1.N×N的棋盘,N为奇数时,与八数码问题相同。
2.N为偶数时,空格每上下移动一次,奇偶性改变。称空格位置所在的行到目标空格所在的行步数为空格的距离(不计左右距离),若两个状态的可相互到达,则有两个状态的逆序奇偶性相同且空格距离为偶数,或者,逆序奇偶性不同且空格距离为奇数数。否则不能。
也就是说,当此表达式成立时,两个状态可相互到达:(状态1的逆序数 + 空格距离)的奇偶性==状态2奇偶性。
对于N*N*N矩阵
三维的结论和二维的结论是一样的。
考虑左右移动空格,逆序不变;同一层上下移动空格,跨过N-1个格子;上下层移动空格,跨过N^2-1个格子。
当N为奇数时,N-1和N^2-1均为偶数,也就是任意移动空格逆序奇偶性不变。那么逆序奇偶性相同的两个状态可相互到达。
当N为偶数时,N-1和N^2-1均为奇数,也就是令空格位置到目标状态空格位置的y z方向的距离之和,称为空格距离。若空格距离为偶数,两个逆序奇偶性相同的状态可相互到达;若空格距离为奇数,两个逆序奇偶性不同的状态可相互到达。
算法实现
A*
设计估价函数
1 | // Author: CodeBoy |
IDA*
使用迭代加深A, 由于后面搜索的空间会很大, 所以一个点超时, 但是对于路径较短的情况, IDA 是相对最快的.
1 | // Author: CodeBoy |
双向 BFS
由于已知开始和结束状态, 可以用双向BFS减少搜索空间.
需要注意反向搜索的状态记录, 记录下相遇时状态, 然后合并答案.
1 | // Author: CodeBoy |
双向 BFS + Cantor 展开
把情况看成排列, 就可以加上 Cantor 展开, 减少空间, 但由于其
1 |
|
十五数码
和八数码大同小异
1 |
|