题目
你被给定一个m×n的二维网格,网格中有一下三种可能的初始化值:
- -1表示墙或是障碍物
- 0表示一扇门
- INF无限表示一个空的房间。然后,我们用231 - 1 = 2147483647 代表INF。你可以认为通往门的距离总是小于2147483647的。
你要给每个空房间位上填上该房间到最近门的距离,如果如法到达门,则填INF即可。
思路
利用广度优先搜索,搜索每个空房间上下左右四个位置,直到找到最近的门或者无法到达门。
from collections import dequeclass Solution:def wallsAndGates(self, rooms):"""Do not return anything, modify rooms in-place instead."""if not rooms or len(rooms) = 0:returnrow = len(rooms)col = len(rooms[0])def bfs(rooms, i, j, val):# val代表当前环向外扩展的距离# 每次进入下一层递归时,表示环向外扩散一层,val + 1# nonlocal row, colif i < 0 or i >= row or j < 0 or j >= col:returnif rooms[i][j] < val:# 如果当前位置已经找打了最近的门,直接返回。即原来是INF,在之前的扫描中已经找到了最近的门returnrooms[i][j] = valbfs(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)
