八数码问题思路
前言:备战蓝桥杯遇到一个八数码问题,整理一下思路。第一次写,不太好,见谅。
BFS是由近到远的扩散过程,解决最短距离问题。搜索的可以是数,也可以是状态,八数码就是状态。从初始状态出发,每次转移都逐步逼近最终状态,每转移一次步数加一,达到目标时,经过的步数就是最短路径。
举个例子:
初始状态
1 | 2 | 3 |
8 | 4 | |
7 | 6 | 5 |
最终状态
1 | 3 | |
8 | 2 | 4 |
7 | 6 | 5 |
把空格看成0,计算最少的移动步数。
共9!种状态。用队列描述BFS,画图模拟一下,这个很简单就不多写了。会发现有重复的情况,那么我们需要判断重复。
八数码问题最重要的就是判断重复。可以用康托展开Cantor()
康托展开是干什么的?