zoukankan      html  css  js  c++  java
  • leetcode 934 最短的桥 DFS+BFS

     思路: 已经告知了是两个岛屿,所以先通过DFS找到其中一个岛并且给其标记,然后把其周围的0收起来,因为跟第二个岛如果隔开的话肯定是有0的,如果没0那就只有一个岛。然后对这一层的0进行广搜,也不断的进行标记,这层0完了以后再广搜下一层,直到找到下一个为1的就是岛屿了。

     1 class Solution {
     2 public:
     3     vector<int> direction{-1, 0, 1, 0, -1};
     4 
     5     int shortestBridge(vector<vector<int>>& A) {
     6         int m = A.size(), n = A[0].size();
     7         queue<pair<int, int>> points;
     8         //使用dfs寻找第一个岛屿,并把1变成2
     9         bool flipped = false;
    10         for (int i(0); i < m; ++i) {
    11             if (flipped) break;
    12             for (int j(0); j < n; ++j) {
    13                 if (A[i][j] == 1) {
    14                     dfs(points, A, m, n, i, j);
    15                     flipped = true;
    16                     break;
    17                 }
    18             }
    19         }
    20         //bfs寻找第二个岛屿,把过程中的0变成2
    21         int x, y;
    22         int level = 0;
    23         while (!points.empty()) {
    24             ++level;
    25             int n_points = points.size();
    26             while (n_points--) {
    27                 auto [r, c] = points.front();
    28                 points.pop();
    29                 for (int k(0); k < 4; ++k) {
    30                     x = r + direction[k], y = c + direction[k + 1];
    31                     if (x >= 0 && y >= 0 && x < m && y < n) {
    32                         if (A[x][y] == 2) continue;
    33                         if (A[x][y] == 1)    return level;
    34                         points.push({x, y});
    35                         A[x][y] = 2;
    36                     }
    37                 }
    38             }
    39         }
    40         return 0;
    41     }
    42 
    43     void dfs(queue<pair<int, int>>& points, vector<vector<int>>& grid, int m, int n,
    44             int i, int j) {
    45         //先考察方向问题
    46         if (i < 0 || j < 0 || i == m || j == n || grid[i][j] == 2) return;
    47         //再考虑别的推出方式
    48         if (grid[i][j] == 0) {
    49             points.push({i, j});
    50             return;
    51         }
    52         grid[i][j] = 2;
    53         dfs(points, grid, m, n, i - 1, j);
    54         dfs(points, grid, m, n, i + 1, j);
    55         dfs(points, grid, m, n, i, j - 1);
    56         dfs(points, grid, m, n, i, j + 1);
    57     }
    58 };
    每天进步一点点~
  • 相关阅读:
    React `${}` 格式
    echarts-for-react
    React 列表 瀑布流 修改样式瀑布流不起效果
    前端技术栈
    React 技术栈
    自定义点击body 退出登录url隐藏
    import 'element-ui/lib/theme-default/index.css'报错
    cnpm install element-ui --save
    Vue http://eslint.org/docs/rules/no-trailing-spaces 报错问题
    【loj 6363】地底蔷薇【拉格朗日反演】【生成函数】
  • 原文地址:https://www.cnblogs.com/libin123/p/14685820.html
Copyright © 2011-2022 走看看