https://leetcode.com/problems/walls-and-gates/#/description
You are given a m x n 2D grid initialized with these three possible values.
-1
- A wall or an obstacle.0
- A gate.INF
- Infinity means an empty room. We use the value231 - 1 = 2147483647
to representINF
as you may assume that the distance to a gate is less than2147483647
.
Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF
.
For example, given the 2D grid:
INF -1 0 INF INF INF INF -1 INF -1 INF -1 0 -1 INF INF
After running your function, the 2D grid should be:
3 -1 0 1 2 2 1 -1 1 -1 2 -1 0 -1 3 4
Sol:
import collections class Solution(object): def wallsAndGates(self, rooms): """ :type rooms: List[List[int]] :rtype: void Do not return anything, modify rooms in-place instead. """ # BFS if not rooms: return r, c = len(rooms), len(rooms[0]) for i in range(r): for j in range(c): if rooms[i][j] == 0: # append each element to a queue # queue here is to transfer a matrix into a queue queue = collections.deque([]) queue.append((i+1, j, 1)) queue.append((i-1, j, 1)) queue.append((i, j+1, 1)) queue.append((i, j-1, 1)) # visited stores elements popped out from queue, and it is added under certain conditions visited = set() while queue: # pop elements from queue and check if it is visited x, y, val = queue.popleft() if x < 0 or x >= r or y < 0 or y >= c or rooms[x][y] in [0, -1] or (x,y) in visited: continue # add unvisited elements to visited set visited.add((x,y)) rooms[x][y] = min(rooms[x][y], val) # add the value of distance in the queue queue.append((x+1, y, val+1)) queue.append((x-1, y, val+1)) queue.append((x, y-1, val+1)) queue.append((x, y+1, val+1))