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 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
, that room should remain filled with INF
Example
Example1
Input:
[[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]]
Output:
[[3,-1,0,1],[2,2,1,-1],[1,-1,2,-1],[0,-1,3,4]]
Explanation:
the 2D grid is:
INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
the answer is:
3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4
Example2
Input: [[0,-1],[2147483647,2147483647]] Output: [[0,-1],[1,2]]
public class Solution { /** * @param rooms: m x n 2D grid * @return: nothing */ public void wallsAndGates(int[][] rooms) { // write your code here Queue<Cell> queue = new LinkedList<>(); int row = rooms.length; int col = rooms[0].length; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (rooms[i][j] == 0) { // x correspond to i => row, y correspond to j => col // start from the smallest point queue.offer(new Cell(i, j, rooms[i][j])); } } } int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; while (!queue.isEmpty()) { Cell cur = queue.poll(); for (int[] dir: directions) { int newX = cur.x + dir[0]; int newY = cur.y + dir[1]; if (newX >= 0 && newX < row && newY >= 0 && newY < col && rooms[newX][newY] == Integer.MAX_VALUE) { rooms[newX][newY] = cur.val + 1; queue.offer(new Cell(newX, newY, rooms[newX][newY])); } } } } } class Cell { int x; int y; int val; public Cell(int x, int y, int val) { this.x = x; this.y = y; this.val = val; } }