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

934. 最短的桥

时间:2022-10-25 23:44:24浏览次数:74  
标签:set return int dfs 最短 vector grid 934

Problem: 934. 最短的桥

目录

思路

  • 基础解题思路:
    • 针对岛问题的解决方法有一种通用的解,就是对 上、下、左、右 各个方向进行查找,判断其是否为 1 ,如果为 1 则改为除 01 意外的任意数字,以此作为标识。
    • 基础解题代码:
    bool isarea(vector<vector<int >>& grid,int x,int y)
    {
        return (x>=0&&x<grid.size()&&y>=0&&y<grid.size());
    }
    int dfs(vector<vector<int>>& grid,int x,int y)
    {
        if(isarea(grid,x,y)==false)
        {
            return -1;
        }
        if(grid[x][y]!=1)
        {
            return -1;
        }
        grid[x][y]=2;
        dfs(grid,x-1,y);
        dfs(grid,x+1,y);
        dfs(grid,x,y-1);
        dfs(grid,x,y+1);
        return 0;
    }
  • 本题解题的思路要在基础之上进行更改便可

解题方法

  • 将每个岛的边提取出来,极大的缩小了数据量,然后对这两个岛的边进行逐个遍历,直到找到最小的距离
  • 这里使用了 \(set<vector<int >>\) 用来去重,然后后面使用了 \(assign()\) 函数将 \(set<vector<int >>\) 转化回了数组 \(vector<vector<int >>\) 当然也可以直接对 \(set<vector<int >>\) 进行遍历

复杂度

  • 时间复杂度:

时间复杂度\(O(n^2)\)

  • 空间复杂度:

空间复杂度\(O(n)\)

Code


class Solution {
private:
    set<vector<int>> bx;
    set<vector<int>> cx;
    int counts=0;
    bool isarea(vector<vector<int >>& grid,int x,int y)
    {
        return (x>=0&&x<grid.size()&&y>=0&&y<grid.size());
    }
    int dfs(vector<vector<int>>& grid,int x,int y)
    {
        if(isarea(grid,x,y)==false)
        {
            return -1;
        }
        if(grid[x][y]==0)
        {
            return -1;
        }
        if(grid[x][y]==2)
        {
            return 1;
        }
        grid[x][y]=2;
        int x1,x2,x3,x4;
        x1=dfs(grid,x-1,y);
        x2=dfs(grid,x+1,y);
        x3=dfs(grid,x,y-1);
        x4=dfs(grid,x,y+1);
        if(x1==-1||x2==-1||x3==-1||x4==-1)
        {
            vector<int > ax;
            ax.push_back(x);
            ax.push_back(y);
            if(counts==0)
            {
                bx.insert(ax);
            }
            else
            {
                cx.insert(ax);
            }  
        }
        return 0;
    }
public:
    int shortestBridge(vector<vector<int>>& grid) {
        int n=grid.size();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1)
                {
                    dfs(grid,i,j);
                    counts++;
                }
            }
        }
        int lengths=20001;
        vector<vector<int >> bxx;
        vector<vector<int >> cxx;
        bxx.assign(bx.begin(),bx.end());//用assign实现set转vector
        cxx.assign(cx.begin(),cx.end());
        for(int i=0;i<bxx.size();i++)
        {
            printf("%d %d\n",bxx[i][0],bxx[i][1]);
        }
        printf("\n");
        for(int j=0;j<cxx.size();j++)
        {
            printf("%d %d\n",cxx[j][0],cxx[j][1]);
        }
        for(int i=0;i<bxx.size();i++)
        {
            for(int j=0;j<cxx.size();j++)
            {
                lengths=min(abs(bxx[i][0]-cxx[j][0])+abs(bxx[i][1]-cxx[j][1])-1,lengths);
            }
        }
        return lengths;
    }
};

标签:set,return,int,dfs,最短,vector,grid,934
From: https://www.cnblogs.com/bzxf/p/16826830.html

相关文章

  • 934. 最短的桥
    934.最短的桥给你一个大小为nxn的二元矩阵grid,其中1表示陆地,0表示水域。岛是由四面相连的1形成的一个最大组,即不会与非组内的任何其他1相连。grid中恰......
  • 两点之间直线最短,你写的是代码,我写的是艺术
    随着需求迭代,团队代码量逐渐增多,熵增崭露头角。临近月底,我打开部分程序,再做一次代码走查。 ✅两点之间直线最短我在做代码走查的时候,发现一个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......