迷宫寻路是计算机编程中基础的问题,常用的算法为广度优先(BFS)和深度优先(DFS)
广度优先、深度优先听起来很高大上的样子,其实非常好理解。
广度优先
在一个点向其周围各个点每个点都尝试走一下,判断哪些能走那些不能走,把能走的点位记录下来(叫做A1)。之后在A1的第一个点位上选择一个点尝试其周围点位是否能走,把能走的记录下来(叫做A2)。再在A1的第二个点位上判断其周围点位是否能走,把能走的追加记录到A2,如此循环直到A1上所有的点都把其周围的可以走的点记录到A2中。
接下来把A2当做A1继续上一段的探索。
深度优先
在一个点向其周围各个点每个点都尝试走一下,当找到一个可以行走的点的时候,以新找到的点为基准继续寻找改点周围那些点是否可以行走,直到找到终点或者无路可走。
无路可走的时候将基准点回退到上一个点,继续尝试上一个点周围可以行走的点。如此往复直到找到终点。
下面看一个老郝通过自己编写的可视化算法工具录制的深度优先算法执行过程:
红色图块为当前探索图块,蓝色图块为已经走过的图块。
该算法并不是找到一条路就会结束,而是需要找到走出迷宫最短的路径。
福利大放送,直接上代码(JS)
通过二维数组构建迷宫,Move函数是主递归函数(还记得进入递归函数后第一件事要干啥不?判断退出条件)。在Move函数中首先判断是否到达终点,其次判断是否探索越界或者当前的步数已经超过了保存的最少步数。最后累加步数,在当前位置基础上进行上下左右的尝试。
Move函数中最后两行尤为重要。
他们代表着当前点向上下左右尝试失败后当前点也就意味着失败。所以把当前点重置,并且把当前步数减掉,回退到上一个点。