以下是宽度优先搜索(BFS)的经典例题及解析,涵盖不同应用场景:
一、迷宫最短路径问题
描述 :给定一个N×M的迷宫矩阵,包含通道(0)、墙壁(-1)和特殊点(如护卫、牛等),求从起点到终点的最短步数。若路径存在,需输出路径坐标;若不存在,则输出-1。
示例 :
输入:
7 8
a#..r.#..#x.
输出:
7
路径:(0,0) -> (0,1) -> (1,1) -> (1,2) -> (2,2) -> (2,3) -> (2,6) -> (2,7) -> (6,7) -> (7,7)
二、跳棋(PAS)问题
描述 :跳棋棋盘为7×8的方格,0表示空位,-1表示白子,+1表示黑子。白子可跳过一个或两个同色棋子到空位,需用最少的步数将黑子移动到目标位置。若无法完成,则输出-1。
示例 :
输入:
原始状态:123456780
目标状态:123456708
步数限制:10
输出:
5
路径:(1,0) -> (2,0) -> (2,1) -> (2,2) -> (3,2) -> (3,3) -> (4,3) -> (4,4) -> (5,4) -> (5,5)
三、积木堆叠问题
描述 :三块积木A、B、C,初始状态为A在顶部,B在中间,C在底部。通过“MOVE(X,Y)”操作(X为积木或桌面,Y为目标位置),求将积木堆叠为A→B→C的最短步数。每次操作后需检查目标位置是否合法。
示例 :
初始状态:ABC
目标状态:CAB
步数:5
路径:
1. MOVE(A,桌面)
2. MOVE(B,桌面)
3. MOVE(C,B)
4. MOVE(A,B)
5. MOVE(C,A)
四、跳蚱蜢问题
描述 :9只盘子围成圆圈,编号1-8,初始状态为顺时针排列。每次跳跃时,空盘可跳过相邻的两个盘子到任意空位,求将盘子重新排列为逆时针顺序的最少跳跃次数。需使用状态压缩和集合去重优化。
示例 :
初始状态:"123456780"
目标状态:"876543210"
最少跳跃次数:9
五、二叉树层序遍历
描述 :给定二叉树,输出其层序遍历结果(从上到下、从左到右)。此问题本质上是BFS在树结构中的应用。
示例 :
输入:
1
/ \
2 3
/ \ \
4 5 6
输出:
[1, 2, 3, 4, 5, 6]
六、单词接龙问题
描述 :给定一个起始单词和一个单词列表,求从起始单词变换为目标单词的最短路径。每次变换需替换一个字母为列表中的任意单词,且变换后的单词需在列表中。若无法完成,则输出-1。
示例 :
输入:
起始单词:"hit"
单词列表:["hot", "dot", "dog", "lot", "log"]
目标单词:"cog"
输出:
5
路径:hit -> hot -> dot -> dog -> cog
七、N皇后问题(扩展)
描述 :在N×N棋盘上放置N个皇后,要求任意两个皇后互不攻击。此问题通常使用回溯算法解决,但可结合BFS优化搜索路径。
总结
以上例题覆盖了BFS在图搜索、路径规划、状态空间遍历等领域的典型应用。解决时需根据具体问题设计状态表示和访问策略,例如使用队列维护待探索节点、使用集合避免重复状态等。