• 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;
        }
    };
    
  • 相关阅读:
    Vue单向数据流
    npm常用命令
    vue自定义指令
    slot的用法(Vue插槽)
    js闭包
    canvas 给画的多边形着色
    canvas画线
    canvas初体验
    canvas
    json
  • 原文地址:https://www.cnblogs.com/linrj/p/13434246.html
Copyright © 2020-2023  润新知