1 public class Solution {
 2     public int shortestDistance(int[][] grid) {
 3         if (grid.length == 0 || grid[0].length == 0) {
 4             return -1;
 5         }
 6         
 7         int[] shift = new int[]{0, 1, 0, -1, 0};
 8         int[][] distance = new int[grid.length][grid[0].length];
 9         int[][] reach = new int[grid.length][grid[0].length];
10         int numBuildings = 0;
11         for (int i = 0; i < grid.length; i++) {
12             for (int j = 0; j < grid[0].length; j++) {
13                 if (grid[i][j] == 1) {
14                     int level = 1;
15                     numBuildings++;
16                     boolean[][] visited = new boolean[grid.length][grid[0].length];
17                     Queue<int[]> queue = new LinkedList<>();
18                     queue.offer(new int[]{i, j});
19                     while (!queue.isEmpty()) {
20                         int size = queue.size();
21                         for (int k = 0; k < size; k++) {
22                             int[] current = queue.poll();
23                             for (int l = 0; l < 4; l++) {
24                                 int x = current[0] + shift[l];
25                                 int y = current[1] + shift[l + 1];
26                                 if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length && !visited[x][y] && grid[x][y] == 0) {
27                                     visited[x][y] = true;
28                                     distance[x][y] += level;
29                                     reach[x][y]++;
30                                     queue.offer(new int[]{x, y});
31                                 }
32                             }
33                         }
34                         level++;
35                     }
36                 }
37             }
38         }
39         
40         int result = Integer.MAX_VALUE;
41         for (int i = 0; i < grid.length; i++) {
42             for (int j = 0; j < grid[0].length; j++) {
43                 if (grid[i][j] == 0 && reach[i][j] == numBuildings) {
44                     result = Math.min(result, distance[i][j]);
45                 }
46             }
47         }
48         return result == Integer.MAX_VALUE ? -1 : result;
49     }
50 }

Basic idea:

1. starting from each element expanding to all map. Find a 0, add one to reach, and level traversal to.

2. Go through each element again. Find the smallest distances.

posted on 2016-07-05 07:03  keepshuatishuati  阅读(127)  评论(0)    收藏  举报