LeetCode934.shortest bridge【dfs+bfs】
一、题面
在给定的二维二进制数组 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
二、分析
首先需要用dfs对一个连通块进行标记,然后对其中一个连通块进行bfs搜索,直到第一次触碰到另外一个连通块,即最少的反转次数。
三、代码
- class Solution {
- public:
- int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
- int N, M;
- void dfs(int x, int y, vector<vector<int>>& A, vector<pair<int, int> >& B)
- {
- int nx, ny;
- A[x][y] = 2;
- B.push_back(make_pair(x, y));
- for(int i = 0; i < 4; i++)
- {
- nx = x + dx[i];
- ny = y + dy[i];
- if(nx>=0 && nx < N && ny>=0 && ny < M && A[nx][ny]==1 )
- {
- dfs(nx, ny, A, B);
- }
- }
- }
- int Min(int a, int b)
- {
- return a<b?a:b;
- }
- int Abs(int a)
- {
- if(a < 0)
- return -a;
- return a;
- }
- int shortestBridge(vector<vector<int>>& A) {
- int ans = 0;
- vector<pair<int, int> > B;
- N = A.size(), M = A[0].size();
- for(int i = 0; i < N; i++)
- {
- for(int j = 0; j < M; j++)
- {
- if(A[i][j]==1)
- {
- dfs(i, j, A, B);
- i = N;
- break;
- }
- }
- }
- /*for(int i = 0; i < N; i++)
- {
- for(int j = 0; j < M; j++)
- {
- cout<<A[i][j]<<" ";
- }
- cout << endl;
- }*/
- queue<pair<int, int> > Q;
- for(int i = 0; i < B.size(); i++)
- {
- Q.push(B[i]);
- }
- while(!Q.empty())
- {
- int Size = Q.size();
- while(Size>0)
- {
- pair<int, int> top = Q.front();
- Q.pop();
- for(int i = 0; i < 4; i++)
- {
- int x = top.first + dx[i];
- int y = top.second + dy[i];
- if(x>=0 && x < N && y>=0 && y < M && A[x][y]==1)
- {
- return ans;
- }
- else if(x>=0 && x < N && y>=0 && y < M && A[x][y]==0)
- {
- A[x][y] = 2;
- Q.push(make_pair(x, y));
- }
- }
- Size--;
- }
- ans++;
- }
- return ans;
- }
- };
LeetCode934.shortest bridge【dfs+bfs】的更多相关文章
- CodeVS 1226 倒水问题【DFS/BFS】
题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- HDU 变形课 1181【DFS/BFS】
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)
Coconuts Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- HDU 1501 Zipper 【DFS+剪枝】
HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【openjudge】【搜索(bfs)】P4980拯救行动
[描述:] 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x). 英勇的骑士(r)决定孤身一人 ...
随机推荐
- Mybatis和Hibernate比较
作者:乌拉拉链接:http://www.zhihu.com/question/21104468/answer/58579295来源:知乎著作权归作者所有,转载请联系作者获得授权. 1.开发对比开发速度 ...
- Luogu 3698 [CQOI2017]小Q的棋盘
BZOJ 4813 虽然数据范围很迷人,但是想树形$dp$没有前途. 先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个 ...
- readfile()
readfile()将一个文件写入到输出缓存参数1:文件名
- Java学习——JSTL标签与EL表达式之间的微妙关系
原文总结的太好了,忍不住记录.转发. 原文地址:http://blog.csdn.net/u010168160/article/details/49182867 目录(?)[-] 一EL表达式 EL相 ...
- 一、office web apps 部署
原文出处:http://www.cnblogs.com/yanweidie/p/4516164.html 原文出处:https://www.cnblogs.com/poissonnotes/p/323 ...
- 浅析C语言中assert的用法(转)
原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...
- POJ2513 Colored Sticks(Trie+欧拉回路)
Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some ...
- 15分XX秒后订单自动关闭(倒计时)
//订单记录 function get_order(){ //请求订单ajax方法 XX.send_api("method",{data},function(){ var date ...
- [转]sessionStorage()和localStorage()的用法
JS的本地保存localStorage.sessionStorage用法总结: 1. localStorage.sessionStorage是Html5的特性,IE7以下浏览器不支持 为什么要掌握lo ...
- 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍
原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...