Walls and Gates
class Solution {
public void wallsAndGates(int[][] rooms) {
if (rooms == null || rooms.length == 0 || rooms[0].length == 0) return;
Queue<Integer> qx = new LinkedList<>();
Queue<Integer> qy = new LinkedList<>();
boolean[][] visited = new boolean[rooms.length][rooms[0].length];
for (int i = 0; i < rooms.length; i++) {
for (int j = 0; j < rooms[0].length; j++) {
if (rooms[i][j] == 0) {
qx.offer(i);
qy.offer(j);
visited[i][j] = true;
}
}
}
int level = 0;
while (!qx.isEmpty()) {
level++;
int size = qx.size();
for (int i = 0; i < size; i++) {
int cx = qx.poll();
int cy = qy.poll();
bfs(rooms, cx, cy, visited, level, qx, qy);
}
}
}
private void bfs(int[][] rooms, int x, int y, boolean[][] visited, int level, Queue<Integer> qx, Queue<Integer> qy) {
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
Queue<Integer> _qx = new LinkedList<>();
Queue<Integer> _qy = new LinkedList<>();
_qx.offer(x);
_qy.offer(y);
while (!_qx.isEmpty()) {
int cx = _qx.poll();
int cy = _qy.poll();
for (int k = 0; k < 4; k++) {
int nx = cx + dx[k];
int ny = cy + dy[k];
if (nx >= 0 && ny >= 0 && nx < rooms.length && ny < rooms[0].length && !visited[nx][ny] && rooms[nx][ny] != -1) {
visited[nx][ny] = true;
rooms[nx][ny] = level;
qx.add(nx);
qy.add(ny);
}
}
}
}
}
最后更新于
这有帮助吗?