1.解法有三种,分别是递归调用的深度优先遍历(顺时针搜索四个方向,如果有门则进入,没有搜索到则回溯一步),非递归调用的深度优先遍历(利用栈的先进后出),广度优先遍历(利用队列的先进先出)
#非递归调用的深度优先遍历
stack.push(入口)
while(!stack.empty)
curPos = stack.pop()
if(curPos == 出口)break
对和curPos相邻的每一个可能的方向
if(newPos可达)
stack.push(newPos)
#广度优先遍历
queue.enqueue(入口)
while(queue.size() != 0)
curPos = queue.dequeue()
if(curPos == 出口)break
对和curPos相邻的每一个可能的方向
if(newPos可达)
stack.enqueue(newPos)
#统一表述,q表示抽象队列
#抽象队列:可入队,可出队。LIFO(stack),FIFO(queue),优先队列(堆是实现优先队列的一个方式)都可以成为一个抽象队列,出队的规则不同。
q.add(入口)
while(!q.empty())
curPos = q.remove()
if(curPos == 出口)break
对和curPos相邻的每一个可能的方向
if(newPos可达)
q.add(newPos)
2.如果有多条路径,则广度优先遍历求出来的是最短路径
3.对于无权图求最短路径–广度优先遍历,对于有权图求最短路径–迪杰特斯拉算法