b_zj_推箱子(记录人与箱子状态)
你可以走到箱子的上下左右任意一侧, 将箱子向另一侧推动。如下图将箱子向右推动一格。输出最少几步能够完成游戏
思路:记录人与箱子状态的bfs
def bfs(n,m,g,start,box):
step=0
q=[(start[0],start[1],box[0],box[1],0)]
vis=[[[[0]*m for i in range(n)] for j in range(m)] for i in range(n)]
vis[start[0]][start[1]][box[0]][box[1]]=1
while q:
px,py,bx,by,step=q.pop(0)
if g[bx][by]=='E':
return step
for dx,dy in zip((0,0,1,-1), (1,-1,0,0)):
npx,npy=px+dx,py+dy
if npx>=0 and npx<n and npy>=0 and npy<m and g[npx][npy]!='#':
if npx==bx and npy==by:
nbx,nby=bx+dx,by+dy
if nbx>=0 and nbx<n and nby>=0 and nby<m and g[nbx][nby]!='#' and not vis[npx][npy][nbx][nby]:
q.append((npx,npy,nbx,nby,step+1))
vis[npx][npy][nbx][nby]=1
else:
if not vis[npx][npy][bx][by]:
q.append((npx,npy,bx,by,step+1))
vis[npx][npy][bx][by]=1
return -1
n,m=map(int, input().split())
g,s,b=[],[],[] #s开始位置,b是箱子位置
for i in range(n):
row=input()
g.append(row)
if not s:
j=row.find("S")
if j!=-1: s=[i,j]
if not b:
j=row.find("0")
if j!=-1: b=[i,j]
print(bfs(n,m,g,s,b))