首页 > 其他分享 >934. 最短的桥

934. 最短的桥

时间:2022-10-25 16:35:21浏览次数:73  
标签:int 最小 dfs 最短 grid 934

934. 最短的桥

给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。
岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。
你可以将任意数量的 0 变为 1 ,以使两座岛连接起来,变成 一座岛 。
返回必须翻转的 0 的最小数目。

输入:grid = [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1

题目链接

返回翻转的0的最小数目使两座岛连接在一起。即求最小从一座岛到另一座岛的最小步数。与之前求点到点最短路径不同的是,岛屿可以从任意部分延伸。因此,可以先用DFS将岛屿标记出来,然后让岛屿的各个部分,延伸。碰到另一个岛,返回延伸的步数即可

class Solution {
public:
    //记录岛
    queue<pair<int,int>>island1;
    //标记处一个岛
    void dfs(int x,int y,vector<vector<int>>& grid){
        if(x<0||x>=grid.size()||y<0||y>=grid[0].size()||grid[x][y]!=1)
            return;
        island1.push({x,y});
        grid[x][y]=2;
        dfs(x+1,y,grid);
        dfs(x-1,y,grid);
        dfs(x,y+1,grid);
        dfs(x,y-1,grid);
    }

    int shortestBridge(vector<vector<int>>& grid) { 
        int step=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                //找到第一个岛屿
                if(grid[i][j]==1){
                    dfs(i,j,grid);
                   
                    int dx[4]={1,-1,0,0};
                    int dy[4]={0,0,1,-1};
                    while(!island1.empty()){
                        int size=island1.size();
                        for(int cnt=0;cnt<size;cnt++){
                            //对于岛的边界,向四周扩展
                            int nx=island1.front().first;
                            int ny=island1.front().second;
                            island1.pop();
                            for(int fd=0;fd<4;fd++){
                                int fx=nx+dx[fd];
                                int fy=ny+dy[fd];
                                if(fx>=0&&fx<grid.size()&&fy>=0&&fy<grid[0].size()){
                                    if(grid[fx][fy]==0){
                                        island1.push({fx,fy});
                                        grid[fx][fy]=2;
                                    }
                                    else if(grid[fx][fy]==1)
                                        return step;
                                }
                            }
                        }
                        step++;
                    }
                }
            }
        }
        return step;
    }
};

标签:int,最小,dfs,最短,grid,934
From: https://www.cnblogs.com/SkyDusty/p/16825320.html

相关文章

  • 两点之间直线最短,你写的是代码,我写的是艺术
    随着需求迭代,团队代码量逐渐增多,熵增崭露头角。临近月底,我打开部分程序,再做一次代码走查。 ✅两点之间直线最短我在做代码走查的时候,发现一个service方法里有这么一段......
  • 最短的桥
    题目给你一个大小为nxn的二元矩阵grid,其中1表示陆地,0表示水域。岛是由四面相连的1形成的一个最大组,即不会与非组内的任何其他1相连。grid中恰好存在两座岛......
  • BZOJ 1001([BeiJing2006]狼抓兔子-最大流转对偶图最短路)
    1001:[BeiJing2006]狼抓兔子TimeLimit: 15Sec  MemoryLimit: 162MBSubmit: 5779  Solved: 1297​​Submit​​][​​Status​​][​​Discuss​​]D......
  • 最短路问题
                   ......
  • 深度优先搜索求最短路径DFS C#实现
    搜索效果 C#项目文件可以点击下载   搜索最短路径的代码:///<summary>///DFS求最短路径///</summary>///<paramname="cX">当前点X坐标</param>///<par......
  • 最短路图
    对于点有点权的图\(g=\{v,e\}\),定义\(i\)到\(j\)的最短路径为所有\(i\)到\(j\)的路径中经过点权和。定义最短路图为\(G=\{V,E\}\),其中\(V\subseteqv,E\sub......
  • 最短路个人总结
    最短路(一)DijkstraDijkstra算法可求任一点到定点的最短路,适于有向图和无向图(对有向图有用的就一定对无向图有用),其边权不可为负(一条边都不行)。数组vis标记访问过的点,数组di......
  • C++课程设计《最短路径》
    C++课程设计《最短路径》课程设计《最短路径》课程设计题目:最短路径实验设计目的与要求:2.1目的:1)熟练应用C++的基本知识、技能。通过本课程设计,总结C++中抽象数据......
  • ac 853有边数限制的最短路
    #include<bits/stdc++.h>usingnamespacestd;constintN=510,M=10010;intn,m,k;intdist[N],backup[N];structEdge{inta,b,w;}edges[M];in......
  • 做题记录整理图论/最短路/dp/记忆化搜索 P3953 [NOIP2017 提高组] 逛公园(2022/10/19)
    P3953[NOIP2017提高组]逛公园https://122720.blog.luogu.org/p3953-ti-xie-ji-yi-hua-sou-suo大佬讲得挺好的,我就不写了#include<bits/stdc++.h>#definefor1(i,a,b......