LeetCode200. 岛屿数量

非常经典的搜索问题。遍历数组,从每一个1开始深度优先搜索当前位置联通的位置是否都是1(也就是与它联通的陆地),用一个额外的布尔数组visited记录每一个位置的元素是否已经访问过,每个遍历过的位置visited都标记为true。

代码如下:

class Solution {
public:
    vector<vector<bool>> visited;
    int res = 0, rows, cols;
    int dx[4] = {1, 0, 0, -1}, dy[4] = {0, 1, -1, 0};            //这两个数组表示x,y的方向
    
    void DFS(int x, int y, vector<vector<bool>>& visited, vector<vector<char>>& grid) {
        visited[x][y] = true;
        for(int i = 0; i < 4; ++i) {                            //搜索四个方向
            int newX = x + dx[i], newY = y + dy[i];            //计算下一个位置
            if(newX < 0 || newX >= rows || newY < 0 || newY >= cols || grid[newX][newY] != '1' || visited[newX][newY]) {      //如果新位置越界或者不为1或者已经访问过了,就跳过
                continue;
            }
            DFS(newX, newY, visited, grid);                   //否则从下一个位置继续寻找联通的1
        }
    }

    int numIslands(vector<vector<char>>& grid) {     
        if(grid.size() == 0 || grid[0].size() == 0) {
            return 0;
        }
        rows = grid.size(), cols = grid[0].size();
        visited = vector<vector<bool>>(rows, vector<bool>(cols, false));
        for(int i = 0; i < rows; ++i) {
            for(int j = 0; j < cols; ++j) {
                if(grid[i][j] == '1' && !visited[i][j]) {      //找到了一个没有被访问过的陆地起点,更新答案数,从这个位置开始DFS,寻找所有与他联通的1,并更新visited数组
                    ++res;
                    DFS(i, j, visited, grid);
                }
            }
        }
        return res;
    }
};
posted @ 2020-08-04 16:46  machine_gun_lin  阅读(82)  评论(0)    收藏  举报