Leetcode 286.墙与门

Time: 20190902
Type: Medium
解法:BFS

题目描述

你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:

-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。

示例:

给定二维网格:

INF  -1  0  INF
INF INF INF  -1
INF  -1 INF  -1
  0  -1 INF INF

运行完你的函数后,该网格应该变成:

  3  -1   0   1
  2   2   1  -1
  1  -1   2  -1
  0  -1   3   4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walls-and-gates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

从门开始宽度优先搜索,环一层一层扩散,能被门的光环覆盖到的时候,就是距离门的最短距离。

这非常直接。

前面写题快有一种思维定式是,只有DFS才有上下左右四个探索,其实BFS也一样可以有递归的写法。

要灵活掌握算法背后的思想。本题用BFS的解法是最简单易懂的。

代码

class Solution:
    def wallsAndGates(self, rooms: List[List[int]]) -> None:
        """
        Do not return anything, modify rooms in-place instead.
        """
        if not rooms or len(rooms) == 0:
            return 
        row = len(rooms)
        col = len(rooms[0])
        
        def bfs(rooms, i, j, val): # val表示环扩展的距离
            nonlocal row, col
            if i < 0 or i >= row or j < 0 or j >= col:
                return
            if rooms[i][j] < val: # 如果当前位置已经找到更近的门了,直接返回
                return
            rooms[i][j] = val
            
            bfs(rooms, i + 1, j, val + 1)
            bfs(rooms, i, j + 1, val + 1)
            bfs(rooms, i - 1, j, val + 1)
            bfs(rooms, i, j - 1, val + 1)
        for i in range(row):
            for j in range(col):
                if rooms[i][j] == 0:
                    bfs(rooms, i, j, 0)

BFS递归函数带着的val表示当前环向外扩展的距离,每次进入下一层递归时,表示环向外扩散一层,则val + 1

比较有意思的是,rooms[i][j]表示当前点到门的距离,如果本身是-1,则表示不用更新,且会挡住继续探索的路径。

如果是INF,且能遍历到这里来,直接更新为val值。

相似的习题

Leetcode 317.离建筑物最近的距离 Hard
Leetcode 489.扫地机器人 Hard
Leetcode 994.腐烂的橘子 Easy

END.

你可能感兴趣的:(LeetCode)