Walls and Gates — Multi-Source BFS from All Gates
Advertisement
Problem 286 · Walls and Gates
Difficulty: Medium · Pattern: Multi-Source BFS
Fill rooms (INF) with minimum distance to nearest gate (0). Walls = -1.
Solutions
# Python
from collections import deque
def wallsAndGates(rooms):
m, n = len(rooms), len(rooms[0])
queue = deque()
INF = 2**31-1
for r in range(m):
for c in range(n):
if rooms[r][c] == 0: queue.append((r,c))
dirs = [(0,1),(0,-1),(1,0),(-1,0)]
while queue:
r, c = queue.popleft()
for dr, dc in dirs:
nr, nc = r+dr, c+dc
if 0<=nr<m and 0<=nc<n and rooms[nr][nc]==INF:
rooms[nr][nc] = rooms[r][c]+1
queue.append((nr,nc))
// Java
public void wallsAndGates(int[][] rooms) {
int m=rooms.length, n=rooms[0].length, INF=Integer.MAX_VALUE;
Queue<int[]> q=new LinkedList<>();
for (int r=0;r<m;r++) for (int c=0;c<n;c++) if (rooms[r][c]==0) q.offer(new int[]{r,c});
int[][] dirs={{0,1},{0,-1},{1,0},{-1,0}};
while (!q.isEmpty()) {
int[] cur=q.poll();
for (int[] d:dirs) {
int nr=cur[0]+d[0], nc=cur[1]+d[1];
if (nr>=0&&nr<m&&nc>=0&&nc<n&&rooms[nr][nc]==INF) {
rooms[nr][nc]=rooms[cur[0]][cur[1]]+1; q.offer(new int[]{nr,nc});
}
}
}
}
Complexity
- Time: O(m*n)
- Space: O(m*n)
Advertisement