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

news/2025/2/25 8:56:28

给你一个由 '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); // 右面
        }

http://www.niftyadmin.cn/n/5865280.html

相关文章

【2025深度学习环境搭建-2】pytorch+Docker+VS Code+DevContainer搭建本地深度学习环境

上一篇文章&#xff1a;【2025深度学习环境搭建-1】在Win11上用WSL2和Docker解锁GPU加速 先启动Docker&#xff01;对文件内容有疑问&#xff0c;就去问AI 一、用Docker拉取pytorch镜像&#xff0c;启动容器&#xff0c;测试GPU docker pull pytorch/pytorch:2.5.0-cuda12.4…

python-leetcode-N 皇后

51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution:def solveNQueens(self, n: int) -> List[List[str]]:res []board [[.] * n for _ in range(n)]def is_safe(row, col):for i in range(row):if board[i][col] Q:return Falseif col - (row - i) >…

opencv:距离变换 cv2.distanceTransform

函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离&#xff08;Distance Transform&#xff0c; DT算法&#xff09;,输出的是保存每一个非零点与最近零点的距离信息&#xff1b;图像上越亮的点&#xff0c;代表了离零点的距离越远。 …

halcon三维点云数据处理(二十五)moments_object_model_3d

目录 一、moments_object_model_3d例程二、moments_object_model_3d函数三、效果图一、moments_object_model_3d例程 这个例子说明了如何使用moments_object_model_3d运算符来将3D数据与x、y、z坐标轴对齐。在实际应用中,通过3D传感器获取的物体模型可能具有一个与物体主轴不…

C++中tuple的用法

C中tuple的用法 在C中&#xff0c;std::tuple 是一个模板类&#xff0c;用于存储一组不同类型的值。它类似于 Python 中的元组&#xff0c;但具有更强大的功能&#xff0c;例如支持不同类型的元素和更复杂的操作。std::tuple 是 C11 标准引入的&#xff0c;位于 <tuple>…

java23种设计模式-工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;学习笔记 &#x1f31f; 定义 工厂方法模式属于创建型设计模式&#xff0c;定义一个创建对象的接口&#xff0c;但让子类决定实例化哪一个类。将类的实例化操作延迟到子类&#xff0c;是面向对象设计中"开闭…

OPPO发布新型折叠屏手机 起售价8999

在竞争激烈的智能手机市场&#xff0c;折叠屏手机作为高端科技的代表&#xff0c;一直备受关注。2025年2月20日晚&#xff0c;OPPO推出最新一代折叠屏旗舰手机Find N5&#xff0c;以其极致轻薄的设计、全面升级的性能和创新的功能&#xff0c;再次成为行业焦点。这款起售价8999…

在大数据项目中如何设计和优化数据模型

在大数据项目中&#xff0c;设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法&#xff1a; 一、数据模型设计 明确业务需求&#xff1a; 深入了解项目的业务场景和目标&#xff0c;明确数据模型需要解决的具体问题。与业务团队紧密合作&#xf…