P1379 八数码难题 题解

本文介绍了八数码难题的解决方案,重点讲解使用宽度优先搜索(BFS)作为模板,对比了DFS和BFS在求解最优解时的效率,并提供了BFS的伪代码和算法分析,包括状态表示、哈希实现、时间复杂度等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客园同步

原题链接

简要题意:

给定一个 3 × 3 3 \times 3 3×3 的矩阵,每次可以把空格旁边(四方向)的一个位置移到空格上。求到目标状态的最小步数。

前置知识:

  • 深度优先搜索( dfs \texttt{dfs} dfs).

将这题作为 宽度优先搜索( bfs \texttt{bfs} bfs 的模板题讲解!

首先,众所周知 dfs \texttt{dfs} dfs 的搜索树类似于这样:

其中,每个矩形都是一个状态,上面的数字是 时间戳(即搜索编号) ,红色的表示往下搜索,绿色的表示往上回溯。

dfs \texttt{dfs} dfs 大致分为 3 3 3 步:

  1. 从当前状态开始,依次搜索子状态,进入第 2 2 2 步。

  2. 如果当前状态 所有子状态都搜完了 或者 没有子状态,那么结束当前搜索,回溯至第 1 1 1 步。

  3. 找到答案即立刻一层层回溯结束;否则搜完所有状态返回无解。

你会发现,对于本题,如果你用 dfs \texttt{dfs} dfs,你不知道深度是多少,很有可能超时。(当然 记忆化 可以加快,但还是容易超时)因为 dfs \texttt{dfs} dfs盲目搜索,直到当前状态搜完为止。那么,极有可能把所有状态都搜一遍。(即 9 ! = 362880 9! = 362880 9!=362880)这是极其危险的!

下面引出一个概念: bfs \texttt{bfs} bfs.

求最小步数 / 最优解的情况下, bfs \texttt{bfs} bfs 一般比 dfs \texttt{dfs} dfs 要来的优。

先给出一个搜索状态图:

你会发现, bfs \texttt{bfs} bfs 的搜索是一层层搜的,即宽度优先的,并且没有任何回溯的过程。

而且, bfs \texttt{bfs} bfs 存在性质:

  1. 第一次到达的一定是最优的。(这是革命的本钱,没有它 bfs \texttt{bfs} bfs 就和 dfs \texttt{dfs} dfs 降为一样效率了)

  2. 一个状态保证只搜一次。(因为第一次是最优的,后面来的都是劣的,所以直接 开哈希剪枝。)

那么你会说:我们怎么实现呢?

queue \text{queue} queue 队列来实现,步骤如下:

  1. 将开始状态入队。

  2. 取出队首作为当前状态,把所有 当前状态能扩展出去的状态 都入队,并且做好哈希。然后 当前状态出队

  3. 找到答案立刻停止搜索(因为性质

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值