1. 题目

在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)

现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。

返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)

示例 1:
输入:[[0,1],[1,0]]
输出:1示例 2:
输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2示例 3:
输入:[[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提示:
1 <= A.length = A[0].length <= 100
A[i][j] == 0 或 A[i][j] == 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-bridge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. BFS解题

  • 先找到第一个1,然后把相连的1用BFS全部加入到队列Q里
  • 然后对Q再使用BFS,直到找到1,就连通了两座岛
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};//移动方向
public:int shortestBridge(vector<vector<int>>& A) {queue<pair<int,int>> q;//第二次BFS用的队列queue<pair<int,int>> firstLand;//第一次BFS用的队列int i, j, n = A.size(), k, x, y, step=0, size;bool found = false;vector<vector<bool>> visited(n,vector<bool> (n, false));for(i = 0; i < n; ++i){for(j = 0; j < n; ++j)if(A[i][j]){q.push(make_pair(i,j));firstLand.push(make_pair(i,j));visited[i][j] = true;found = true;break;}if(found)break;}pair<int,int> tp;while(!firstLand.empty())//第一次BFS{tp = firstLand.front();firstLand.pop();for(k = 0; k < 4; ++k){x = tp.first + dir[k][0];y = tp.second + dir[k][1];if(x>=0 && x<n && y>=0 && y<n && A[x][y] && !visited[x][y]){firstLand.push(make_pair(x,y));q.push(make_pair(x,y));//q里存储了所有的第一个岛的点visited[x][y] = true;}}}found = false;while(!q.empty())//第二次BFS{size = q.size();while(size--)//向外扩展一层{tp = q.front();q.pop();for(k = 0; k < 4; ++k){x = tp.first + dir[k][0];y = tp.second + dir[k][1];if(x>=0 && x<n && y>=0 && y<n && !visited[x][y]){if(A[x][y] == 0){q.push(make_pair(x,y));visited[x][y] = true;}else//找到1了,连通了{found = true;break;}}}if(found)break;}step++;if(found)break;}return step-1;//最后一步1不算,所以-1}
};

LeetCode 934. 最短的桥(2次BFS)相关推荐

  1. LeetCode 934 最短的桥

    题目描述 在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大 组.)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛.返回必须翻转的 0 的最小数目.(可 ...

  2. 【LeetCode】934. 最短的桥

    题目 934. 最短的桥 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域. 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连.grid ...

  3. leetcode934. 最短的桥(dfs+bfs)

    在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大组.) 现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛. 返回必须翻转的 0 的最小数目.(可以保证答 ...

  4. 【934. 最短的桥】

    来源:力扣(LeetCode) 描述:   给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域.   岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其 ...

  5. Leetcode最短的桥

    934. 最短的桥 思路:先通过任意搜索方法找到其中一个岛屿 然后利用广度优先搜索,查找其与另一个岛屿的最短距离. class Solution {public:vector<int> d ...

  6. LeetCode:127 单词接龙 无向图BFS

    LeetCode:127 单词接龙 无向图BFS 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下 ...

  7. LeetCode 244. 最短单词距离 II(哈希map+set二分查找)

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 哈希表+set二分查找 1. 题目 请设计一个类,使该类的构造函数能够接收一个单词列表. 然后再实现一个方法,该方法能够分别接收两个单词 w ...

  8. LeetCode 245. 最短单词距离 III

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. word1 和 word2 是有可能相同的,并且它们将分别表 ...

  9. LeetCode 243. 最短单词距离

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. 示例: 假设 words = ["practice ...

最新文章

  1. 对IOC,AOP的理解
  2. 王者归来:分布式调度解决方案 ElasticJob 重启!
  3. 【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
  4. Nginx之windows下搭建
  5. maven下载spring
  6. 正则表达式 正整数_史上最全的正则表达式 (1) -- 校验数字的表达式
  7. linux getline函数用法,Linux文本处理三剑客之awk学习笔记05:getline用法详解
  8. 最新出炉|也许你该看看这份的模型数据
  9. Linux IO模型漫谈(4)- 非阻塞IO
  10. Polyverse Infected Mushroom Bundle Mac(声音处理器插件包)
  11. SQL语句学习1——SHOW命令
  12. RTCM3.3电文信号,消息类型GPS MSM4的解码
  13. PHP采集利器:phpQuery,像jQuery一样轻松采集内容
  14. MYSQL索引3:聚簇索引和非聚簇索引
  15. 浪潮提出“计算+”挖大数据商机
  16. 【es6学习】Babel 转码器详解
  17. 5. 有 2*n 的一个长方形方格,用一个1*2 的骨牌铺满方格
  18. 字符串匹配/模糊匹配(查找/模糊查找)的算法
  19. idea 检测 重复代码_IntelliJ IDEA 15 EAP,支持动态代码重复检测
  20. spring启动时只执行一次的方法实现

热门文章

  1. linux telnet 权限,允许telnet 通过root用户进行访问
  2. 字符串循环右移的一道题目
  3. fck java_FCkjava三种调用方法
  4. Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...
  5. Excel 取消Internet及网络路径自动替换为超链接
  6. WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...
  7. Python简单的抓取静态网页内容
  8. response.setContentType()的作用及MIME参数详解
  9. 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
  10. 基于ArcEngine与C#的鹰眼地图实现