934.最短的桥
给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。
岛是 4 向连接的 1 组,不与任何其他 1 连接。grid 中 恰好存在两座岛 。
你可以将任意数量的 0 变为 1 ,以使两座岛连接起来,变成 一座岛 。
返回必须翻转的 0 的最小数目。
示例 1:
输入:grid = [[0,1],[1,0]] 输出:1
思路:用DFS标记出一个岛的所有位置并“入队列”,再用BFS扩散直到遇到另一个岛。
代码:
class Solution { public: void DFS(vector<vector<int>>& grid, int x, int y, queue<pair<int, int>>& q) { if (x < 0 || x == grid.size() || y < 0 || y == grid[0].size() || grid[x][y] != 1) { return ; } grid[x][y] = -1; q.push({x, y}); DFS(grid, x - 1, y, q); DFS(grid, x + 1, y, q); DFS(grid, x, y - 1, q); DFS(grid, x, y + 1, q); } int shortestBridge(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); queue<pair<int, int>> q; for (int i = 0, flag = 1; i < m && flag; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] == 1) { DFS(grid, i, j, q); flag = 0; break; } } } int step = 0; int dx[4] = {0, 0, -1, 1}; int dy[4] = {1, -1, 0, 0}; while (!q.empty()) { int size = q.size(); while (size--) { pair<int, int> cur = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int x = cur.first + dx[i]; int y = cur.second + dy[i]; if (x >= 0 && x < m && y >= 0 && y < n) { if(grid[x][y] == 1) return step; if(grid[x][y] == 0) { grid[x][y] = -1; q.push({x, y}); } } } } step++; } return step; } };
闲话:BFS和DFS在考完研后就没再看了,第一眼看到这题时有点懵,大概知道这题应该用BFS和DFS但就是不知道怎么写,这就是为什么要复习的原因吧。