BFS 应用 力扣 《二进制矩阵中的最短路径》与《滑动谜题》 Python解法

1091.二进制矩阵中的最短路径

在这里插入图片描述
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述
提示:

  1. 1 <= grid.length == grid[0].length <= 100
  2. grid[i][j] 为 0 或 1

实现:

class Solution:
class Solution:
    def shortestPathBinaryMatrix(self, grid:list[list[int]])->int:
       q,n=[(0,0,2)],len(grid)
       if grid[0][0] or grid[-1][-1]:
           return -1
       elif n <= 2:
           return n

       #BFS starts
       for i,j,d in q:
           #current node: i,j; distance = d
           for x, y in [(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),
                       (i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)]:#代表八连通图的 上下左右斜上斜下斜左斜右
               if 0 <= x <n and 0<=y<n and not grid[x][y]:
                   if x == n-1 and y== n-1:
                       return d
                   q += [(x,y,d+1)]
                   grid[x][y] = 1
        return -1                

771.滑动谜题
在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.
一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.
最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。
给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。

示例1:
输入:board = [[1,2,3],[4,0,5]]
输出:1
解释:交换 0 和 5 ,1 步完成

示例2:
输入:board = [[1,2,3],[5,4,0]]
输出:-1
解释:没有办法完成谜板

示例3:
输入:board = [[4,1,2],[5,0,3]]
输出:5
解释:
最少完成谜板的最少移动次数是 5 ,
一种移动路径:
尚未移动: [[4,1,2],[5,0,3]]
移动 1 次: [[4,1,2],[0,5,3]]
移动 2 次: [[0,1,2],[4,5,3]]
移动 3 次: [[1,0,2],[4,5,3]]
移动 4 次: [[1,2,0],[4,5,3]]
移动 5 次: [[1,2,3],[4,5,0]]

输入:board = [[3,2,4],[1,5,0]]
输出:14

提示:
① board 是一个如上所述的 2 x 3 的数组.
② board[i][j] 是一个 [0, 1, 2, 3, 4, 5] 的排列.

实现:

class Solution(object):
    def slidingPuzzle(self, board: List[List[int]]) -> int:
        board = board[0]+board[1] #把board连起来变一堆
        moves = [(1,3),(0,2,4),(1,5)(0,4)(1,3,5),(2,4)] #把每个位置的0可以交换位置
        q,visited = [(tuple(board),board.index(0),0)],set() #bfs队列和已访问状态记录
        while q:
            state, now, step = q.pop(0) #分别代表当前状态,0的当前位置和当前步数
            if state == (1,2,3,4,5,0): #找到了
                return step
            for next in moves[now]: #遍历所有可交换位置
                _state = list(state)
                _state[next],_state[now] = _state[now], state[next] #交换位置
                _state = tuple(_state)
                if _state not in visited: #确认未访问
                    q.append((_state,next,step+1))
                visited.add(state)
        return -1            

猜你喜欢

转载自blog.csdn.net/gcyqweasd/article/details/106052109