Walls and Gates

You are given a m x n 2D grid initialized with these three possible values.

  1. -1 - A wall or an obstacle.
  2. 0 - A gate.
  3. INF - Infinity means an empty room. We use the value 2^31 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than 2147483647.

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:

  1. INF -1 0 INF
  2. INF INF INF -1
  3. INF -1 INF -1
  4. 0 -1 INF INF

After running your function, the 2D grid should be:

  1. 3 -1 0 1
  2. 2 2 1 -1
  3. 1 -1 2 -1
  4. 0 -1 3 4

Solution:

  1. public class Solution {
  2. int[] dx = {-1, 1, 0, 0};
  3. int[] dy = {0, 0, -1, 1};
  4. public void wallsAndGates(int[][] rooms) {
  5. if (rooms.length == 0 || rooms[0].length == 0)
  6. return;
  7. int n = rooms.length, m = rooms[0].length;
  8. for (int i = 0; i < n; i++) {
  9. for (int j = 0; j < m; j++) {
  10. if (rooms[i][j] == 0) {
  11. bfs(rooms, n, m, i, j);
  12. }
  13. }
  14. }
  15. }
  16. void bfs(int[][] rooms, int n, int m, int i, int j) {
  17. Queue<Integer[]> queue = new LinkedList<>();
  18. queue.add(new Integer[]{i, j});
  19. queue.add(null);
  20. int level = 1;
  21. while (!queue.isEmpty()) {
  22. Integer[] p = queue.poll();
  23. if (p != null) {
  24. for (int k = 0; k < 4; k++) {
  25. int x = p[0] + dx[k];
  26. int y = p[1] + dy[k];
  27. if (x >= 0 && x < n && y >= 0 && y < m && rooms[x][y] > level) {
  28. rooms[x][y] = level;
  29. queue.add(new Integer[]{x, y});
  30. }
  31. }
  32. } else if (!queue.isEmpty()) {
  33. level++;
  34. queue.add(null);
  35. }
  36. }
  37. }
  38. }