# 0317. Shortest Distance from All Buildings
###### tags: `Leetcode` `Hard` `BFS`
Link: https://leetcode.com/problems/shortest-distance-from-all-buildings/
## 思路 $O(M^2N^2)$ $O(MN)$
从每个building开始搜起,对于位于(i,j)的building,做bfs,算出每个empty land到这个building的距离,然后跟之前算出来的距离求和放进dist里,同时要计算出每个empty land能到达几个building
最后做完bfs之后,找能到达所有empty land的点,找出他们的dist最小值就是答案
## Code
```java=
class Solution {
public int shortestDistance(int[][] grid) {
int m = grid.length, n = grid[0].length;
int[][] dist = new int[m][n];
int[][] reach = new int[m][n];
int[][] dirs = new int[][]{{0,1},{1,0},{-1,0},{0,-1}};
int buildingNum = 0;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j]==0 || grid[i][j]==2) continue;
buildingNum++;
boolean[][] visited = new boolean[m][n];
visited[i][j] = true;
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{i,j});
int d = 0;
while(!q.isEmpty()){
int size = q.size();
for(int k=0; k<size; k++){
int[] curr = q.poll();
dist[curr[0]][curr[1]] += d;
reach[curr[0]][curr[1]] += 1;
for(int[] dir:dirs){
int nextx = curr[0]+dir[0];
int nexty = curr[1]+dir[1];
if(nextx>=0 && nextx<m && nexty>=0 && nexty<n && !visited[nextx][nexty] && grid[nextx][nexty]==0){
q.add(new int[]{nextx, nexty});
visited[nextx][nexty] = true;
}
}
}
d++;
}
}
}
int ans = Integer.MAX_VALUE;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j]==0 && reach[i][j]==buildingNum){
ans = Math.min(ans, dist[i][j]);
}
}
}
return ans==Integer.MAX_VALUE?-1:ans;
}
}
```