[算法题解详细]DFS解力扣419,200

题目

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。
示例1

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例2

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示

 1. m == grid.length
 2. n == grid[i].length
 3. 1 <= m, n <= 300
 4. grid[i][j] 的值为 '0''1'

思路

因为此题的代码和思路都与力扣419甲板上的战舰这题非常的相似,所以今天直接来分析这两题
首先题目给出的依旧是一个二维网格,每个点值为**'1’代表陆地**,值为**'0’代表水域**,并且陆地之前相连的方向也规定为水平或竖直,所以这题我们只需要对这个二维网格进行遍历,然后在遍历的点值为’1’的时候进入dfs,在dfs中,我们标记当前搜索的点,并且向上下左右四个方向进行搜索,最后在记录进入dfs的次数就是岛屿的数量了,下面看代码

代码

首先是主函数,进行一次遍历并且条件是当前点值为1时进入dfs函数,同时记录次数

class Solution {
    
    
public:
    int m, n;
    int count = 0;
    int numIslands(vector<vector<char>>& grid) {
    
    
        m = int(grid.size());
        n = int(grid[0].size());
        for(int i = 0; i < m; i++) {
    
    
            for(int j = 0; j < n; j++) {
    
    
                if(grid[i][j] == '1') {
    
    
                    dfs(grid, i, j);
                    ++count;
                }
            }
        }
        return count;
    }
};

然后在dfs中,出口条件还是坐标越界或者当前搜索的点值不等于’1’或等于我们做标记的值

void dfs(vector<vector<char>>& grid, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] !='1' || grid[x][y] == 'Q') {
    
    
            return;
        }
}

出口条件写完后,我们就需要对当前点进行标记,然后对当前点的上下左右进行访问

void dfs(vector<vector<char>>& grid, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] !='1' || grid[x][y] == 'Q') {
    
    
            return;
        }
        grid[x][y] = 'Q';
        dfs(grid, x + 1, y);
        dfs(grid, x - 1, y);
        dfs(grid, x, y + 1);
        dfs(grid, x, y - 1);
}

最后把代码整合起来
完整代码:

class Solution {
    
    
public:
    int m, n;
    void dfs(vector<vector<char>>& grid, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] !='1' || grid[x][y] == 'Q') {
    
    
            return;
        }
        grid[x][y] = 'Q';
        dfs(grid, x + 1, y);
        dfs(grid, x - 1, y);
        dfs(grid, x, y + 1);
        dfs(grid, x, y - 1);
    }
    int numIslands(vector<vector<char>>& grid) {
    
    
        m = int(grid.size());
        n = int(grid[0].size());
        int count = 0;
        for(int i = 0; i < m; i++) {
    
    
            for(int j = 0; j < n; j++) {
    
    
                if(grid[i][j] == '1') {
    
    
                    dfs(grid, i, j);
                    ++count;
                }
            }
        }
        return count;
    }
};

然后是419题,因为那题也是求战舰的数量,其实质与这一题是完全一样的,下面我把完整代码放出来供大家对比参考
419题完整代码:

class Solution {
    
    
public:
    int m, n;
    void dfs(vector<vector<char>>& board, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'X' || board[x][y] == 'A') {
    
    
            return;
        }
        board[x][y] = 'A';
        dfs(board, x + 1, y);
        dfs(board, x - 1, y);
        dfs(board, x, y + 1);
        dfs(board, x, y - 1);
    }
    int countBattleships(vector<vector<char>>& board) {
    
    
        m = int(board.size());
        n = int(board[0].size());
        int ans = 0;
        for(int i = 0; i < m; i++) {
    
    
            for(int j = 0; j < n; j++) {
    
    
                if(board[i][j] == 'X') {
    
    
                    dfs(board, i, j);
                    ++ans;
                }
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_61607810/article/details/121086276