934. 最短的桥(BFS+DFS)

934. 最短的桥

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

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

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

 

示例 1:

输入:A = [[0,1],[1,0]]
输出:1

示例 2:

输入:A = [[0,1,0],[0,0,0],[0,0,1]]
输出:2

示例 3:

输入:A = [[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

 

提示:

  • 2 <= A.length == A[0].length <= 100
  • A[i][j] == 0 或 A[i][j] == 1
复制代码
  1 #include <iostream>
  2 #include <vector>
  3 #include <queue>
  4 #include <utility>
  5 using namespace std;
  6 
  7 class Solution {
  8 public:
  9     vector<vector<int>> g_direction = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
 10     queue<std::pair<int, int>> points;
 11     void dfs(vector<vector<int>> &grid, int x, int y) {
 12         grid[x][y] = 2;
 13         int m = grid.size();
 14         int n = grid[0].size();
 15         // 四个方向进行DFS
 16         for (int i = 0; i < 4; i++) {
 17             int xNext = x + g_direction[i][0];
 18             int yNext = y + g_direction[i][1];
 19             if ((xNext >= 0 && xNext < m) && (yNext >= 0 && yNext < n)) {
 20                 if (grid[xNext][yNext] == 2) {
 21                     continue;
 22                 }
 23                 if (grid[xNext][yNext] == 1) {
 24                     dfs(grid, xNext, yNext);
 25                 }
 26                 // 该岛屿的边界位置入队
 27                 if (grid[xNext][yNext] == 0) {
 28                     points.push(make_pair(xNext, yNext));
 29                 }
 30             }
 31         }
 32     }
 33     int shortestBridge(vector<vector<int>>& grid) {
 34         int step = 0;
 35         int m = grid.size();
 36         int n = grid[0].size();
 37         bool flag = false; // 是否找到第一座岛屿
 38         for (int i = 0; i < m; i++) {
 39             if (flag) {
 40                 break;
 41             }
 42             for (int j = 0; j < n; j++) {
 43                 if (grid[i][j] == 1) {
 44                     dfs(grid, i, j);
 45                     flag = true;
 46                     break;
 47                 }
 48             }
 49         }
 50         // 多源BFS
 51         while (!points.empty()) {
 52             int size = points.size();
 53             step++;
 54             for (int i = 0; i < size; i++) {
 55                 // 每个多源起点出队,并找出各个未访问过的起点的相邻点并入队
 56                 std::pair<int, int> pos = points.front();
 57                 points.pop();
 58                 for (int j = 0; j < 4; j++) {
 59                     int xNext = pos.first + g_direction[j][0];
 60                     int yNext = pos.second + g_direction[j][1];
 61                     if ((xNext >= 0 && xNext < m ) && (yNext >= 0 && yNext < n)) {
 62                         if (grid[xNext][yNext] == 1) {
 63                             return step;
 64                         }
 65                         if (grid[xNext][yNext] == 2) {
 66                             continue;
 67                         }
 68                         points.push(make_pair(xNext, yNext));
 69                         grid[xNext][yNext] = 2;
 70                     }
 71                 }
 72             }
 73         }
 74         return step;
 75     }
 76 };
 77 int main()
 78 {
 79     FILE *fpIn;
 80     fpIn = freopen("D:\\test.txt", "r", stdin);
 81     if (fpIn == nullptr) {
 82         std::cout << "freopen fail!" << endl;
 83     }
 84     int m = 0;
 85     int n = 0;
 86     std::cin >> m >> n;
 87     std::cout << "m = " << m << ", n = " << n << endl;
 88     vector<vector<int>> graph(m, vector<int>(n));
 89     // 构建地图
 90     for (int i = 0; i < m; i++) {
 91         for (int j = 0; j < n; j++) {
 92             std::cin >> graph[i][j];
 93         }
 94     }
 95     // 打印无向图
 96     for (int i = 0; i < m; i++) {
 97         for (int j = 0; j < n; j++) {
 98             std::cout << graph[i][j] << " ";
 99         }
100         std::cout << endl;
101     }
102     Solution *test = new Solution();
103     std::cout << "step = "<< test->shortestBridge(graph) << endl;
104     system("pause");
105     return 0;
106 }
复制代码

测试输入文件(test.txt):

5
5
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

验证运行结果:

 

 

posted @   跳动的休止符  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示