317. 離建築物最近的距離


題目:

你是個房地產開發商,想要選擇一片空地 建一棟大樓。你想把這棟大樓夠造在一個距離周邊設施都比較方便的地方,通過調研,你希望從它出發能在 最短的距離和 內抵達周邊全部的建築物。請你計算出這個最佳的選址到周邊全部建築物的 最短距離和。

 

注意:

你只能通過向上、下、左、右四個方向上移動。

給你一個由 0、1 和 2 組成的二維網格,其中:

0 代表你可以自由通過和選擇建造的空地
1 代表你無非通行的建築物
2 代表你無非通行的障礙物
 

示例:

輸入: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]

1 - 0 - 2 - 0 - 1
| | | | |
0 - 0 - 0 - 0 - 0
| | | | |
0 - 0 - 1 - 0 - 0

輸出: 7

解析:
給定三個建築物 (0,0)、(0,4) 和 (2,2) 以及一個位於 (0,2) 的障礙物。
由於總距離之和 3+3+1=7 最優,所以位置 (1,2) 是符合要求的最優地點,故返回7。
注意:
你會保證有至少一棟建築物,如果無法按照上述規則返回建房地點,則請你返回 -1。

 

解答:

做不出來,先想到了從每個0開始DFS,但覺得復雜度太高了。

正確做法是從每個1開始BFS,因為要找的就是達到所有建築物的最短距離和。所以從每個建築物分別開始BFS,計算的達到某節點的距離,就是該建築物到達該節點的最短距離。

從所有的建築物BFS遍歷所有節點,最短距離和就算出來了。

寫到這里,發現以前做過一道類似的題目,好像也是類似的情景,需要從目的地分別開始向所有出發地BFS。

總結一下:最短距離/最短距離和的題目,先想一下用BFS是不是更好做,不要什么題一上來就知道DFS。。

 

代碼:

 

 1 class Solution {
 2 public:
 3     int shortestDistance(vector<vector<int>>& grid) {
 4         int m=grid.size(),n=grid[0].size();
 5         if(m==0 or n==0){return 0;}
 6         vector<vector<int>> reached_buildings(m,vector<int>(n,0));//記錄有幾個建築物能到達當前位置
 7         vector<vector<int>> path_cnt(m,vector<int>(n,0));//記錄所有建築物到當前位置的距離總和
 8         vector<vector<int>> dif={{0,1},{0,-1},{1,0},{-1,0}};
 9         vector<vector<bool>> visited(m,vector<bool>(n,false));
10         int build_cnt=0,res=INT32_MAX;
11         bool flag=false;
12         for(int i=0;i<m;++i){  
13             for(int j=0;j<n;++j){
14                 if(grid[i][j]!=1){continue;}
15                 build_cnt++;
16                 res=INT_MAX;
17                 queue<pair<int,int>> my_que;
18                 my_que.push({i,j});
19                 int cur_path_len=1;
20                 while(not my_que.empty()){
21                     int cur_siz=my_que.size();
22                     for(int k=0;k<cur_siz;++k){
23                         auto cur=my_que.front();
24                         my_que.pop();
25                         for(auto& d:dif){
26                             int x=cur.first+d[0],y=cur.second+d[1];
27                             if(x>=0 and x<m and y>=0 and y<n and visited[x][y]==flag and grid[x][y]==0){
28                                 my_que.push({x,y});
29                                 visited[x][y]=!flag;
30                                 path_cnt[x][y]+=cur_path_len;
31                                 reached_buildings[x][y]+=1;
32                                 if(reached_buildings[x][y]==build_cnt){
33                                     res=min(res,path_cnt[x][y]);
34                                 }
35                             }
36                         }
37                     }
38                     cur_path_len++;
39                 }
40                 flag=!flag;
41             }
42         }
43         return res==INT_MAX?-1:res;
44     }
45 };

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM