目录
八数码问题简介:
在 3×3 的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。
棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。
要求解的问题是: 给出一种初始布局(初始状态)和目标布局,找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变
(为了简化棋盘,我们把每个数字按每行缩成一个长串)
Input | 初始:123456780 目标:087654321 | 初始:123456780 目标:123456708 | 初始:123456780 目标:123456870 | 初始:123456780 目标:123456780 |
---|---|---|---|---|
Ouput | 28 | 1 | No solve | 0 |
比 如 说 : [ 1 2 3 4 5 6 7 8 0 ] ⟶ 1 步 [ 1 2 3 4 5 6 7 0 8 ] 比如说: \left[\begin{matrix}1 & 2 & 3 \\4 & 5 & 6\\7 & 8 & 0\\\end{matrix}\right]\stackrel{1步}\longrightarrow\left[\begin{matrix}1 & 2 & 3 \\4 & 5 & 6\\7 & 0 & 8\\\end{matrix}\right] 比如说:⎣⎡147258360⎦⎤⟶1步⎣⎡147250368⎦⎤
比 如 说 : [ 1 2 3 4 5 6 7 8 0 ] ⟶ 28 步 [ 0 8 7 6 5 4 3 2 1 ] 比如说:\left[\begin{matrix}1 & 2 & 3 \\4 & 5 & 6\\7 & 8 & 0\\\end{matrix}\right]\stackrel{28步}\longrightarrow\left[\begin{matrix}0 & 8 & 7 \\6 & 5 & 4\\3 & 2 & 1\\\end{matrix}\right] 比如说:⎣⎡147258360⎦⎤⟶28步⎣⎡063852741⎦⎤
比 如 说 : [ 1 2 3 4 5 6 7 8 0 ] ⟶ N U L L [ 1 2 3 4 5 6 8 7 0 ] 比如说:\left[\begin{matrix}1 & 2 & 3 \\4 & 5 & 6\\7 & 8 & 0\\\end{matrix}\right]\stackrel{NULL}\longrightarrow\left[\begin{matrix}1 & 2& 3 \\4 & 5 & 6\\8 & 7 & 0\\\end{matrix}\right] 比如说:⎣⎡147258360⎦⎤⟶NULL⎣⎡148257360⎦⎤
判断是否有解:
这是一个非常经典的搜索问题,但是有时候我们会发现从 初始状态 到达不了 目标状态 ,这时候我们就需要提前判断是否有解 ( 不然无解的时候搜索算法会一直搜 )
先说结论:
把棋盘状态表示成一维的形式,求出除 0 之外所有数字的逆序数之和,称为这个状态的逆序
(也就是每个数字前面比它大的数字的个数的和)
若两个状态的逆序 奇偶性相同 ,则 可相互到达,否则 不可相互到达
例如: 123456780 和 213456780
逆序对和数为 28 和 27
所以无法互相到达
证明:
证明其必要性: 如果两个状态逆序对的和奇偶性不同,则必然不能互相抵达
首先,对于 3 × 3 3\times3 3×3 的格子,当 0 0 0 元素与任意元素交换(进行移动),表现在压缩之后的长串数字上分别是:
左移:将 0 0 0 与前一位交换,此时总逆序奇偶性不变
因为 0 0 0 本身不算在逆序对计算内,总体顺序没有改变
右移:将 0 0 0 与后一位交换,同左移
上移:将 0 0 0 与前第三位交换,此时总逆序奇偶性不变
假设被 0 0 0 交换元素是 A,中间元素有两个,分别是B,C
- 如果有 A>B 和 A>C 则总体逆序对个数 -2 ,奇偶性不变
- 如果有 A>B 和 A<C 则总体逆序对不变 ,奇偶性不变
- 如果有 A<B 和 A>C 同理 2
- 如果有 A<B 和 A<C 则总体逆序对个数 +2, 奇偶性不变
下移:将 0 0