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
验证运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理