当前位置:   article > 正文

LeetCode:实现两座岛屿的最短距离_leetcode 两个区域之间的最短距离

leetcode 两个区域之间的最短距离
  1. 给定一个二维0-1矩阵,其中1表示陆地,0表示海洋,每个位置与上下左右相连.岛是由
  2. 四面相连的1形成的一个最大组.已知矩阵存在两个岛屿,求最少要填造陆多少个
  3. 位置才可以将两个岛屿相连.
  4. 示例 1:
  5. Input:[[1,1,1,1,1],
  6. [1,0,0,0,1],
  7. [1,0,1,0,1],
  8. [1,0,0,0,1],
  9. [1,1,1,1,1]]
  10. Output:1
  11. 示例 2:
  12. Input:[[0,1],
  13. [1,0]]
  14. Output:2
  15. 示例 3:
  16. Input:[[0,1,0],
  17. [0,0,0],
  18. [0,0,1]]
  19. Output:2
  20. 解题思路:
  21. 本题实际上是求两个岛屿间的最短距离,因此可以先通过任意搜索方法找到其中一个岛屿
  22. ,然后利用广度优先搜索,查找其与另外一个岛屿的最短距离.

C++语言实现

  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;
  5. class Solution{
  6. public:
  7. int shortestBridge(vector<vector<int>>& grid){
  8. int m=grid.size(),n=grid[0].size();
  9. queue<pair<int,int>> points;
  10. /*dfs寻找第一个岛屿,并把1赋值为2,并把其周边的海洋入队*/
  11. bool flag=false;
  12. for(int i=0;i<m;i++){
  13. if(flag) break;
  14. for(int j=0;j<n;j++){
  15. if(grid[i][j]==1){
  16. dfs(points,grid,m,n,i,j);
  17. flag=true;
  18. break;
  19. }
  20. }
  21. }
  22. /*bfs寻找第二个岛屿,并把过程中经过的0赋值给2*/
  23. int x,y,count=0;
  24. while(!points.empty()){
  25. ++count;
  26. auto n_points=points.size();
  27. while(n_points--){
  28. //auto [r,c]=points.front();/*c++17*/
  29. auto point=points.front();
  30. int r=point.first,c=point.second;
  31. points.pop();
  32. for(int k=0;k<4;++k){
  33. x=r+direction[k],y=c+direction[k+1];
  34. if(x>=0&&y>=0&&x<m&&y<n){
  35. if(grid[x][y]==2)
  36. continue;
  37. if(grid[x][y]==1)
  38. return count;
  39. points.push({x,y});
  40. grid[x][y]=2;
  41. }
  42. }
  43. }
  44. }
  45. return 0;
  46. }
  47. private:
  48. vector<int> direction{-1,0,1,0,-1};
  49. void dfs(queue<pair<int,int>>& points,vector<vector<int>>& grid,int m,int n,int i,int j){
  50. if(i<0||i==m||j<0||j==n||grid[i][j]==2){
  51. return;
  52. }
  53. if(grid[i][j]==0){
  54. points.push({i,j});
  55. return;
  56. }
  57. grid[i][j]=2;
  58. dfs(points,grid,m,n,i-1,j);
  59. dfs(points,grid,m,n,i+1,j);
  60. dfs(points,grid,m,n,i,j-1);
  61. dfs(points,grid,m,n,i,j+1);
  62. }
  63. };
  64. int main(int argc,char* argv[]){
  65. vector<vector<int>> grid={{0,1,0},{0,0,0},{0,0,1}};
  66. cout<<Solution().shortestBridge(grid)<<endl;
  67. return 0;
  68. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/562819
推荐阅读
相关标签
  

闽ICP备14008679号