当前位置: 首页 > news >正文

力扣hot100——岛屿数量 岛屿问题经典dfs总结

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

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

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

解题思路:

        // 类比二叉树的dfs方法; 递归检查左右子树

        // 将网格中的元素看作一个四叉的 就有四个((看作四个子树),不同在于会出现重复遍历兜圈子

        // 因此需要在每个格子元素遍历后将其加一个标志 true 表示遍历过,false 表示没有遍历

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        // 类比二叉树的dfs方法; 递归检查左右子树
        // 将网格中的元素看作一个四叉的 就有四个((看作四个子树),不同在于会出现重复遍历兜圈子
        // 因此需要在每个格子元素遍历后将其加一个标志 true 表示遍历过,false 表示没有遍历
        // 二叉树
        // dfs(treenode *root){
        // if (root == null) {
        //     return;
        // }
        // // 访问两个相邻结点:左子结点、右子结点
        // dfs(root.left);
        // dfs(root.right);
        // }
        // 网格深度优先遍历
        // void grid_dfs(vector<vector<char>>& grid,vector<vector<bool>>& grid_judg ,int r,int c){
        //     if(r > grid.size() || c > grid[0].size() || r<0 || c<0){ // 超出网格范围
        //         return; 
        //     }
        //     
        //     if(grid_jude[r][c] || grid[r][c] !=1 ){ // 判断是否为遍历过的岛屿
        //         return; 
        //     }
        //     grid_jude[r][c] = true;
        //     grid_dfs(grid,r-1,c); // 上面
        //     grid_dfs(grid,r+1,c); // 下面
        //     grid_dfs(grid,r,c-1); // 左面
        //     grid_dfs(grid,r,c+1); // 右面
        // }
        if (grid.empty() || grid[0].empty()) {
            return 0; // 如果网格为空,直接返回 0
        }

        int row = grid.size(), col = grid[0].size();
        int res = 0;
        vector<vector<bool>> grid_judg(row, vector<bool>(col, false)); // 保存是否遍历过

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == '1' && !grid_judg[i][j]) {
                    ++res; // 发现一个新的岛屿
                    grid_dfs(grid, grid_judg, i, j); // 递归标记整个岛屿
                }
            }
        }

        return res;
    }

    void grid_dfs(vector<vector<char>>& grid, vector<vector<bool>>& grid_judg, int r, int c) {
        // 边界条件检查
        if (r < 0 || r >= grid.size() || c < 0 || c >= grid[0].size()) {
            return; // 超出网格范围
        }

        // 如果当前格子是水或已经访问过,直接返回
        if (grid[r][c] != '1' || grid_judg[r][c]) {
            return;
        }

        // 标记当前格子为已访问
        grid_judg[r][c] = true;
        // 递归访问上下左右四个方向
        grid_dfs(grid, grid_judg, r - 1, c); // 上面
        grid_dfs(grid, grid_judg, r + 1, c); // 下面
        grid_dfs(grid, grid_judg, r, c - 1); // 左面
        grid_dfs(grid, grid_judg, r, c + 1); // 右面
    }
};

dfs:

将网格中的元素看作一个四叉的 就有四个((看作四个子树),不同在于会出现重复遍历兜圈子

因此需要在每个格子元素遍历后将其加一个标志 true 表示遍历过,false 表示没有遍历。

      void grid_dfs(vector<vector<char>>& grid,vector<vector<bool>>& grid_judg ,int r,int c){
            if(r > grid.size() || c > grid[0].size() || r<0 || c<0){ // 超出网格范围
                return; 
            }
            
            if(grid_jude[r][c] || grid[r][c] !=1 ){ // 判断是否为遍历过的岛屿
                return; 
            }
            grid_jude[r][c] = true;
            grid_dfs(grid,r-1,c); // 上面
            grid_dfs(grid,r+1,c); // 下面
            grid_dfs(grid,r,c-1); // 左面
            grid_dfs(grid,r,c+1); // 右面
        }

相关文章:

  • 安全面试5
  • 常见高低压开关柜
  • 「软件设计模式」责任链模式(Chain of Responsibility)
  • Python Seaborn库使用指南:从入门到精通
  • RPA自动化测试流程构建体系搭建 实例
  • 分库分表中间件开源
  • matlab ylabel怎么让y轴显示的标签是正的
  • JavaWeb-Servlet对象生命周期
  • 比特信噪比与信噪比SNR的换算公式
  • 【练习】【排列No.1】力扣46. 全排列
  • 第十七:嵌套路由
  • 【AutoSar】DeepSeek回答什么是IO抽象
  • 协方差(Covariance)与得分函数:从Fisher信息矩阵看统计关联
  • 在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南
  • C#中提供的多种集合类以及适用场景
  • 危化品经营单位安全管理人员的职责及注意事项
  • 数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
  • 无人机实战系列(三)本地摄像头+远程GPU转换深度图
  • 4 算法1-3 三连击(升级版)
  • 《机器学习数学基础》补充资料:欧几里得空间的推广
  • 金融月评|尽早增强政策力度、调整施策点
  • 泰山、华海、中路等山东险企综合成本率均超100%,承保业务均亏损
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣
  • 机构发布“2025中国高职院校排名”
  • 美国务卿鲁比奥将前往土耳其参加俄乌会谈
  • 中巡组在行动丨①震慑:这些地区有官员落马