LC934.最短的桥

LC934.最短的桥
image.png

思路:DFS + BFS

  • 先DFS,把其中一座岛全部变成2
  • 在BFS,以全部为2的岛作为出发点,BFS,到1就停止,返回当前在BFS树上的层次level,就是需要翻转的个数。
  • 注意,为了防止重复访问,需要在BFS入队的时候,将元素进行改变。

    代码:

    1. class Solution {
    2. private:
    3. int dx[4] = {1, 0, -1, 0};
    4. int dy[4] = {0, 1, 0, -1};
    5. int row, col;
    6. public:
    7. bool check(int x, int y) {
    8. if (0 <= x && x < row && 0 <= y && y < col) {
    9. return true;
    10. }
    11. return false;
    12. }
    13. void dfs(vector<vector<int>>& grid, int x, int y) {
    14. if (grid[x][y] == 1) {
    15. grid[x][y] = 2;
    16. for (int i = 0; i < 4; i++) {
    17. int nx = x + dx[i], ny = y + dy[i];
    18. if (check(nx, ny) && grid[nx][ny] == 1) {
    19. dfs(grid, nx, ny);
    20. }
    21. }
    22. }
    23. }
    24. int shortestBridge(vector<vector<int>>& grid) {
    25. // 1. DFS,把其中一座岛全部变成2
    26. // 2. BFS,找到1就停
    27. row = grid.size(), col = grid[0].size();
    28. queue<pair<int, int>> q;
    29. // DFS
    30. bool once_exc = true;
    31. for (int i = 0; i < row; i++) {
    32. for (int j = 0; j < col; j++) {
    33. if (grid[i][j] == 1 && once_exc) {
    34. dfs(grid, i, j);
    35. once_exc = false;
    36. }
    37. }
    38. }
    39. // BFS
    40. for (int i = 0; i < row; i++) {
    41. for (int j = 0; j < col; j++) {
    42. if (grid[i][j] == 2) {
    43. q.push({i, j});
    44. }
    45. }
    46. }
    47. // level 就是BFS上的层次
    48. int level = 0;
    49. while (!q.empty()) {
    50. for (int k = 0, nq = q.size(); k < nq; k ++) {
    51. int cx = q.front().first, cy = q.front().second;
    52. q.pop();
    53. for (int i = 0; i < 4; i++) {
    54. int nx = cx + dx[i], ny = cy + dy[i];
    55. if (!check(nx, ny)) {
    56. continue;
    57. }
    58. // 返回当前层次
    59. if (grid[nx][ny] == 1) {
    60. return level;
    61. }
    62. // 变成3,入队的时候防止重复遍历
    63. if (grid[nx][ny] != 2 && grid[nx][ny] != 3) {
    64. q.push({nx, ny});
    65. grid[nx][ny] = 3;
    66. }
    67. }
    68. }
    69. level += 1;
    70. }
    71. return -1;
    72. }
    73. };