上一篇“一文弄懂递归”中,埋了一个使用递归来找到迷宫的解的坑。这篇文章记录一下如何使用 BFS 和 DFS 来找到迷宫的解。
迷宫
这篇文章主要是针对一种被称为“完美迷宫”的特殊迷宫类型。一个完美迷宫是一个没有环路和不可进入的区域,起点和终点都由一条路径连接的迷宫。
下图显示了一个完美的迷宫,以及从左上角的入口到右下角的出口的路径:
-------
-@@@@@-
-----@-
-@@@-@-
-@---@-
你会接收到这样的一个输入,其中-代表通路,@代表墙。
针对这个输入,会提供一个 readMazeFile()
方法来读取数据,它会把数据读成一个二维向量,为了方便,我们这里用 grid 简称。其中每一个元素可以用 grid[row][col] 来进行访问。如果是通路,那么就会返回 true, 如果是思路就会返回 false。
接下来,这篇文章将讲解如何使用 BFS( 广度优先搜索) 与 DFS( 深度优先搜索) 来让计算机找到这个迷宫的解。
BFS 广度优先搜索
特征与要求
特征:
- Nearly exhaustive search
- 如果在当前长度没有搜索到采取搜索下一层:如搜索了所有的两步内的结果,没有找到,采取寻找第三步
需要的数据结构:
A data structure to represent (partial word) ladders
- 我们需要一个能够记录我们走了什么路径的数据结构 —— Stack
A data structure to store all the partial word ladders that we have generated so far and have yet to explore
- 我们需要记录我们还要探索哪些路径 —— Queue
A data structure to keep track of all the words that we've explored so far, so that we avoid getting stuck in loops
- 我们需要有一个能够记录我们已经走了哪些位置的数据结构 ——Set
有了如上的数据结构,我们可以看一下如何使用它们
例子
假设我们要走如下这个迷宫,我们的起点是左下角,并且我们只能向上或者向右走。
首先,在探索可以走的点(邻近)