1 public class Solution { 2 private int[][] rooms; 3 public void wallsAndGates(int[][] rooms) { 4 if (rooms.length == 0 || rooms[0].length == 0) { 5 return; 6 } 7 this.rooms = rooms; 8 for (int i = 0; i < rooms.length; i++) { 9 for (int j = 0; j < rooms[0].length; j++) { 10 if (rooms[i][j] == 0) { 11 BFS(i, j); 12 } 13 } 14 } 15 } 16 private void BFS(int x, int y) { 17 Queue<Integer> node = new LinkedList<>(); 18 node.offer(x * rooms[0].length + y); 19 int level = -1; 20 while (!node.isEmpty()) { 21 int size = node.size(); 22 level++; 23 for (int i = 0; i < size; i++) { 24 int a = node.peek() / rooms[0].length; 25 int b = node.poll() % rooms[0].length; 26 27 rooms[a][b] = level; 28 if (a > 0 && rooms[a - 1][b] > level + 1) { 29 node.offer((a-1) * rooms[0].length + b); 30 } 31 if (a < rooms.length - 1 && rooms[a + 1][b] > level + 1) { 32 node.offer((a+1) * rooms[0].length + b); 33 } 34 if (b > 0 && rooms[a][b - 1] > level + 1) { 35 node.offer(a * rooms[0].length + b - 1); 36 } 37 if (b < rooms[0].length - 1 && rooms[a][b + 1] > level + 1) { 38 node.offer(a * rooms[0].length + b + 1); 39 } 40 } 41 } 42 } 43 }
Use level + 1 to avoid traversal two rooms back and forth.