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