题目描述
解题思路
由于题目要找你找的是最短路径当然用bfs。为什么用bfs找到的路径就是最短呢,因为bfs依赖的原理是队列,队列先进先出,比如找一个树的最短路径bfs遍历完第一层才会遍历第二层,因为在第一层找到满足条件的第二层时添加到队列里永远是第一层的后面,所以说bfs找到的一定是最短路径。题目又要求字典序最小,那么入队的时候就按照字典序从小到大入队。该题的具体解法请看下面代码注释。
代码
n,m=30,50
walked=set()#记录走过的点
nums=[list(map(int,input())) for _ in range(n)]
def stop(x,y):
'''判断是否越界或者走过'''
if x<0 or y<0 or x>=30 or y>=50 or nums[x][y]==1 or ((x,y) in walked):#因为队列是先进先出,如果你后来还发现被走过了说明你已经不是最短路径的构成了所以也不满足
return False
return True
def bfs(x,y):
#找最短路径,bfs宽度优先遍历算法,先遍历离自己最近的
que=[(x,y,'')]
while que:
x,y,z=que.pop(0)#遍历到该结点直接弹出
if stop(x,y):#判断是否是不满足的情况,如果不是则继续添加他的子节点到队列后方
walked.add((x,y))#满足条件了,说明要走这个点,那么就把他记录在已经走过的节点上
que.append((x+1,y,z+'D'))#按字母顺序入队,能让路径满足字典序最小
que.append((x,y-1,z+'L'))
que.append((x,y+1,z+'R'))
que.append((x-1,y,z+'U'))
if x==29 and y==49:#按照bfs思想谁先到出口既是最短路径
return z
print(bfs(0,0))