主要是开辟坐标维度即可,将三维和四维当成步数和路径进行移动。在q中存在多个列表,并不是覆盖之前的,要和DFS区分。
1,列表储存路径
2,注意BFS就是用队列实现的
我们这里用的是双端队列deque
即可用作队列(用popleft,append实现)先进先出,也可用作栈(用pop,append实现)先进后出。
3,关于输出字典序最小的最短路径,我们在for循环时将字典序小的放前面,这样得到的结果就是字典序最小的。
4.queue队列必须用[()]的形式储存坐标,直接[]不行,append后再次popleft的就不是坐标(),会报错
from collections import deque
n,m=map(int,input().split())
mg=[]
for i in range(n):
list1=list(map(int,input()))
mg.append(list1)
vis=[[0]*m for i in range(n)]
def bfs(x,y,ex,ey,t,s):
q=deque([(x,y,t,s)])
vis[x][y]=1
while q:
p=q.popleft()
#print(p)
x,y,t,s=p[0],p[1],p[2],p[3]
if x==ex and y==ey:
break
for dx,dy,ds in [(1,0,'D'),(0,-1,'L'),(0,1,'R'),(-1,0,'U')]:
nx=dx+x
ny=dy+y
ns=[ds]+s
if 0<=nx<n and 0<=ny<m and vis[nx][ny]!=1 and mg[nx][ny]!=1:
vis[nx][ny]=1
nt=t+1
q.append((nx,ny,nt,ns))
return t,s
t,s=bfs(0,0,n-1,m-1,0,[])
print(t)
print(s)
字符储存路径
from collections import deque
n,m=map(int,input().split())
mg=[]
for i in range(n):
list1=list(map(int,input()))
mg.append(list1)
vis=[[0]*m for i in range(n)]
def bfs(x,y,ex,ey,t,s):
q=deque([(x,y,t,s)])
vis[x][y]=1
while q:
p=q.popleft()
#print(p)
x,y,t,s=p[0],p[1],p[2],p[3]
if x==ex and y==ey:
break
for dx,dy,ds in [(1,0,'D'),(0,-1,'L'),(0,1,'R'),(-1,0,'U')]:
nx=dx+x
ny=dy+y
ns=ds+s
if 0<=nx<n and 0<=ny<m and vis[nx][ny]!=1 and mg[nx][ny]!=1:
vis[nx][ny]=1
nt=t+1
q.append((nx,ny,nt,ns))
return t,s
t,s=bfs(0,0,n-1,m-1,0,'')
print(t)
print(s)
迷宫
需要注意的有
mg列表的类型必须与判断条件 mg[nx][ny] != 1一样
import os
import sys
# 请在此输入您的代码
from collections import deque
queue = deque([(0,0,0,'')])
n, m = 30, 50
ex, ey = n - 1, m - 1
mg = []
for i in range(n):
list1 = list(input())
mg.append(list1)
#print(mg)
vis = [[0] * m for i in range(n)]
vis[0][0] = 1
while queue:
nows = queue.popleft()
#print(nows)
x, y, t, f = nows[0],nows[1],nows[2],nows[3]
if x == ex and y == ey:
break
for dx, dy, df in [(1, 0, 'D'), (0, -1, 'L'), (0, 1, 'R'), (-1, 0, 'U')]:
nx = dx + x
ny = dy + y
if 0 <= nx < n and 0 <= ny < m and mg[nx][ny] != '1' and vis[nx][ny] != 1:
vis[nx][ny] = 1
nt = t + 1
nf = f + df
queue.append((nx, ny, nt, nf))
print(nows[3])