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.

posted on 2016-07-06 15:17  keepshuatishuati  阅读(126)  评论(0编辑  收藏  举报