一、题面

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

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

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

示例 1:

  1. 输入:[[0,1],[1,0]]
  2. 输出:1

示例 2:

  1. 输入:[[0,1,0],[0,0,0],[0,0,1]]
  2. 输出:2

示例 3:

  1. 输入:[[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]]
  2. 输出:1

提示:

  1. 1 <= A.length = A[0].length <= 100
  2. A[i][j] == 0 或 A[i][j] == 1

二、分析

首先需要用dfs对一个连通块进行标记,然后对其中一个连通块进行bfs搜索,直到第一次触碰到另外一个连通块,即最少的反转次数。

三、代码

  1. class Solution {
  2. public:
  3. int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
  4. int N, M;
  5.  
  6. void dfs(int x, int y, vector<vector<int>>& A, vector<pair<int, int> >& B)
  7. {
  8. int nx, ny;
  9. A[x][y] = 2;
  10. B.push_back(make_pair(x, y));
  11. for(int i = 0; i < 4; i++)
  12. {
  13. nx = x + dx[i];
  14. ny = y + dy[i];
  15. if(nx>=0 && nx < N && ny>=0 && ny < M && A[nx][ny]==1 )
  16. {
  17. dfs(nx, ny, A, B);
  18. }
  19. }
  20. }
  21. int Min(int a, int b)
  22. {
  23. return a<b?a:b;
  24. }
  25. int Abs(int a)
  26. {
  27. if(a < 0)
  28. return -a;
  29. return a;
  30. }
  31. int shortestBridge(vector<vector<int>>& A) {
  32. int ans = 0;
  33. vector<pair<int, int> > B;
  34. N = A.size(), M = A[0].size();
  35. for(int i = 0; i < N; i++)
  36. {
  37. for(int j = 0; j < M; j++)
  38. {
  39. if(A[i][j]==1)
  40. {
  41. dfs(i, j, A, B);
  42. i = N;
  43. break;
  44. }
  45. }
  46. }
  47. /*for(int i = 0; i < N; i++)
  48. {
  49. for(int j = 0; j < M; j++)
  50. {
  51. cout<<A[i][j]<<" ";
  52. }
  53. cout << endl;
  54. }*/
  55. queue<pair<int, int> > Q;
  56. for(int i = 0; i < B.size(); i++)
  57. {
  58. Q.push(B[i]);
  59. }
  60. while(!Q.empty())
  61. {
  62. int Size = Q.size();
  63. while(Size>0)
  64. {
  65. pair<int, int> top = Q.front();
  66. Q.pop();
  67.  
  68. for(int i = 0; i < 4; i++)
  69. {
  70. int x = top.first + dx[i];
  71. int y = top.second + dy[i];
  72. if(x>=0 && x < N && y>=0 && y < M && A[x][y]==1)
  73. {
  74. return ans;
  75. }
  76. else if(x>=0 && x < N && y>=0 && y < M && A[x][y]==0)
  77. {
  78. A[x][y] = 2;
  79. Q.push(make_pair(x, y));
  80. }
  81. }
  82. Size--;
  83. }
  84. ans++;
  85. }
  86.  
  87. return ans;
  88.  
  89. }
  90. };

  

LeetCode934.shortest bridge【dfs+bfs】的更多相关文章

  1. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  2. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  3. HDU 变形课 1181【DFS/BFS】

    变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...

  4. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  6. HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

    Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  7. HDU 1501 Zipper 【DFS+剪枝】

    HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...

  8. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  9. 【openjudge】【搜索(bfs)】P4980拯救行动

    [描述:] 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x). 英勇的骑士(r)决定孤身一人 ...

随机推荐

  1. Mybatis和Hibernate比较

    作者:乌拉拉链接:http://www.zhihu.com/question/21104468/answer/58579295来源:知乎著作权归作者所有,转载请联系作者获得授权. 1.开发对比开发速度 ...

  2. Luogu 3698 [CQOI2017]小Q的棋盘

    BZOJ 4813 虽然数据范围很迷人,但是想树形$dp$没有前途. 先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个 ...

  3. readfile()

    readfile()将一个文件写入到输出缓存参数1:文件名

  4. Java学习——JSTL标签与EL表达式之间的微妙关系

    原文总结的太好了,忍不住记录.转发. 原文地址:http://blog.csdn.net/u010168160/article/details/49182867 目录(?)[-] 一EL表达式 EL相 ...

  5. 一、office web apps 部署

    原文出处:http://www.cnblogs.com/yanweidie/p/4516164.html 原文出处:https://www.cnblogs.com/poissonnotes/p/323 ...

  6. 浅析C语言中assert的用法(转)

    原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...

  7. POJ2513 Colored Sticks(Trie+欧拉回路)

    Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some ...

  8. 15分XX秒后订单自动关闭(倒计时)

    //订单记录 function get_order(){ //请求订单ajax方法 XX.send_api("method",{data},function(){ var date ...

  9. [转]sessionStorage()和localStorage()的用法

    JS的本地保存localStorage.sessionStorage用法总结: 1. localStorage.sessionStorage是Html5的特性,IE7以下浏览器不支持 为什么要掌握lo ...

  10. 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍

    原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...