zoukankan      html  css  js  c++  java
  • 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))
    
  • 相关阅读:
    流形学习(Mainfold Learning)
    陈皓的博客
    背包九讲
    阮一峰的个人网站
    PyTorch教程【六】Transforms的使用
    PyCharm设置代码提示忽略大小写
    PyTorch教程【五】TensoBoard的使用
    pip 换源
    PyCharm常用快捷键
    JAVA基础篇—HashMap
  • 原文地址:https://www.cnblogs.com/wdt1/p/14153562.html
Copyright © 2011-2022 走看看