LeetCode 934. 最短的桥(2次BFS)
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)相关推荐
- LeetCode 934 最短的桥
题目描述 在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大 组.)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛.返回必须翻转的 0 的最小数目.(可 ...
- 【LeetCode】934. 最短的桥
题目 934. 最短的桥 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域. 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连.grid ...
- leetcode934. 最短的桥(dfs+bfs)
在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大组.) 现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛. 返回必须翻转的 0 的最小数目.(可以保证答 ...
- 【934. 最短的桥】
来源:力扣(LeetCode) 描述: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域. 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其 ...
- Leetcode最短的桥
934. 最短的桥 思路:先通过任意搜索方法找到其中一个岛屿 然后利用广度优先搜索,查找其与另一个岛屿的最短距离. class Solution {public:vector<int> d ...
- LeetCode:127 单词接龙 无向图BFS
LeetCode:127 单词接龙 无向图BFS 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下 ...
- LeetCode 244. 最短单词距离 II(哈希map+set二分查找)
文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 哈希表+set二分查找 1. 题目 请设计一个类,使该类的构造函数能够接收一个单词列表. 然后再实现一个方法,该方法能够分别接收两个单词 w ...
- LeetCode 245. 最短单词距离 III
文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. word1 和 word2 是有可能相同的,并且它们将分别表 ...
- LeetCode 243. 最短单词距离
文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. 示例: 假设 words = ["practice ...
最新文章
- 对IOC,AOP的理解
- 王者归来:分布式调度解决方案 ElasticJob 重启!
- 【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
- Nginx之windows下搭建
- maven下载spring
- 正则表达式 正整数_史上最全的正则表达式 (1) -- 校验数字的表达式
- linux getline函数用法,Linux文本处理三剑客之awk学习笔记05:getline用法详解
- 最新出炉|也许你该看看这份的模型数据
- Linux IO模型漫谈(4)- 非阻塞IO
- Polyverse Infected Mushroom Bundle Mac(声音处理器插件包)
- SQL语句学习1——SHOW命令
- RTCM3.3电文信号,消息类型GPS MSM4的解码
- PHP采集利器:phpQuery,像jQuery一样轻松采集内容
- MYSQL索引3:聚簇索引和非聚簇索引
- 浪潮提出“计算+”挖大数据商机
- 【es6学习】Babel 转码器详解
- 5. 有 2*n 的一个长方形方格,用一个1*2 的骨牌铺满方格
- 字符串匹配/模糊匹配(查找/模糊查找)的算法
- idea 检测 重复代码_IntelliJ IDEA 15 EAP,支持动态代码重复检测
- spring启动时只执行一次的方法实现
热门文章
- linux telnet 权限,允许telnet 通过root用户进行访问
- 字符串循环右移的一道题目
- fck java_FCkjava三种调用方法
- Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...
- Excel 取消Internet及网络路径自动替换为超链接
- WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...
- Python简单的抓取静态网页内容
- response.setContentType()的作用及MIME参数详解
- 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
- 基于ArcEngine与C#的鹰眼地图实现