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))
posted @ 2020-12-18 10:12  童年の波鞋  阅读(97)  评论(0编辑  收藏  举报