934.最短的桥

题目

给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。

 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。

你可以将任意数量的 0 变为 1 ,以使两座岛连接起来,变成 一座岛 。

返回必须翻转的 0 的最小数目。

示例 1:

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

示例 2:

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

示例 3:

输入: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

提示:

  • n == grid.length == grid[i].length
  • 2 <= n <= 100
  • grid[i][j] 为 0 或 1
  • grid 中恰有两个岛

思路

        第一次广搜:先对矩阵进行遍历,找出第一座岛的一个陆地单元格,并将他作为广搜的起始点。把起始点添加到队列中,同时将他标记为-1表示已访问,然后从队列中取出元素,对上下左右四个相邻单元格进行检查。如果相邻单元格处于矩阵范围内且为陆地,就标记为-1并加入队列。持续这个过程,直到队列为空,把第一座岛的所有陆地单元格都标记为-1。

        第二次广搜:把所有标记为-1的陆地单元格添加到队列中,当作第二次广搜的起点。同时,把sum初始化为-1。最后队列中取出元素,对上下左右四个相邻单元格进行检查,如果相邻单元格处于矩阵范围内且为第二座岛的陆地,则说明已找到第二座岛,返回sum+1。如果相邻单元格处于矩阵范围内且为水域,就将他标记为-1并加入队列。每完成一层的扩展,就把sum的值加1。

代码

class Solution {
public:
    //用于上下左右移动
    int di[4]={-1,0,1,0};
    int dj[4]={0,-1,0,1};
    int shortestBridge(vector>& grid) {
        //用于bfs的队列
        queue>res;
        //获取网格的大小
        int n=grid.size(),a,b;
        // 找到第一座岛的一个陆地单元格
        for(int i=0;i=0&&x=0&&y=0&&x=0&&y=0&&x=0&&y

你可能感兴趣的:(算法,c++,leetcode,广搜,广度优先)