首页 > 其他分享 >深度优先搜索 - 岛屿问题

深度优先搜索 - 岛屿问题

时间:2024-10-11 21:47:13浏览次数:8  
标签:优先 格子 int 岛屿 网格 DFS 搜索 grid

题目描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。

200. 岛屿数量 - 力扣(LeetCode)

示例 :

输入:grid =

[["1","1","0","0","0"],

 ["1","1","0","0","0"],

 ["0","0","1","0","0"],

 ["0","0","0","1","1"]]。

输出:3

 解题思路

1. 问题理解

首先,我们需要明确什么是岛屿。在这个问题中,岛屿是由四面相连的'1'(陆地)形成的区域,并且这些区域完全被'0'(水)包围。我们的目标是计算给定网格中岛屿的数量。

2. 遍历网格

由于我们不知道岛屿的具体位置,因此我们需要遍历整个网格。对于网格中的每个格子,我们检查它是否是陆地('1')。

3. 深度优先搜索(DFS)

当我们遇到一个陆地格子时,我们知道我们找到了一座岛屿的一部分。为了计算完整的岛屿数量,我们需要确保我们不会重复计算同一座岛屿的不同部分。这就是DFS派上用场的地方。

DFS是一种递归算法,它从当前格子开始,并尽可能深地搜索所有相邻的陆地格子。在搜索过程中,它将访问过的格子标记为已访问(例如,将其值从'1'更改为'0'),以确保我们不会再次访问它们。

4. 递归搜索

对于当前陆地格子,我们执行以下操作:

  • 将当前格子标记为已访问。
  • 对当前格子的上、下、左、右四个相邻格子进行递归调用DFS。但是,在调用之前,我们需要检查相邻格子是否在网格范围内内,并且它们是否是陆地('1')。

5. 计数岛屿

每次我们从一个未访问的陆地格子开始DFS搜索时,我们都知道我们找到了一座新的岛屿。因此,我们可以在每次开始DFS搜索时增加岛屿计数器。

6. 终止条件

DFS搜索将在以下情况下终止:

  • 我们已经访问了网格中的所有格子,并且没有更多的陆地格子可以访问。
  • 我们尝试访问一个不在网格范围内的格子。
  • 我们尝试访问一个已经访问过的格子(即其值为'0')。

7. 重复步骤

我们重复上述步骤,直到网格中的所有格子都被访问过。

8. 输出结果

最后,我们输出岛屿计数器的值,即网格中岛屿的数量。

class Solution {
public:
    int n, m;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    int numIslands(vector<vector<char>>& grid) {
        n = grid.size();
        m = grid[0].size();
        int ret = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    ret++;
                }
            }
        }
        return ret;
    }
    
    void dfs(vector<vector<char>>& grid, int i, int j) {
        grid[i][j] = '2';
        for (int k = 0; k < 4; k++) {
            int tmpx = i + dx[k];
            int tmpy = j + dy[k];
            if (tmpx >= 0 && tmpx < n && tmpy >= 0 && tmpy < m &&
                grid[tmpx][tmpy] == '1') {
                dfs(grid, tmpx, tmpy);
            }
        }
    }
};

标签:优先,格子,int,岛屿,网格,DFS,搜索,grid
From: https://blog.csdn.net/2302_80190174/article/details/142862267

相关文章

  • 遗传算法与直接搜索
    遗传算法[x,fval]=ga(@fitnessfun,nvars,A,b,Aeq,beq,LB,UB,@nonlcon,options)%x和fval为变量的值和目标函数的值%ga函数内部的参数与非线性规划函数的意义一样,nvars为变量数。直接搜索[x,fval]=patternsearch(@fun,nvars,A,b,Aeq,beq,LB,UB,@nonlco......
  • 进程状态|进程优先级
    目录一、进程状态1.什么是进程状态2.进程状态都包含什么?3.进程状态的查看4.进程退出(1)进程退出的步骤(2)僵尸进程(3)孤儿进程二、进程优先级1.进程优先级是什么?2.为什么要有进程优先级?3.查看进程优先级4.进程优先级的修改(1)为什么nice值范围只有[-20,19]?(2)进程优先级由......
  • 【C++】二叉搜索树+变身 = 红黑树
    ......
  • [Python手撕]不同的二叉搜索树(给出具体的树)
    #Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgenerateTrees(self,n:int)->List......
  • 浙江大学数据结构04-树7 二叉搜索树的操作集
    题目本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:BinTreeInsert(BinTreeBST,ElementTypeX);BinTreeDelete(BinTreeBST,ElementTypeX);PositionFind(BinTreeBST,ElementTypeX);PositionFindMin(BinTreeBST);PositionFindMax(BinTr......
  • 力扣:搜索插入位置代码实现
    题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 python实现classSolution:defsearchInsert(self,nums:List[int],target:int)->i......
  • 06-蓝图实战(图书数据搜索与查询),编写get和post请求,同时应用WTForms参数验证
    需求:之前的路由请求格式,不是通用的请求格式,转化为get和post请求之后,可以通过request方法获取其中的参数参考格式 04-使用Flask框架实现POST和GET接口-马铃薯1-博客园(cnblogs.com)@web.route('/book/search/<q>')defsearch(q):pass 第三方插件库,WTForms......
  • 又一款windows搜索神器!非常实用的文件搜索工具,可以说很智能了(带私活源码)
     哈喽,大家好,今天为大家介绍一款文件搜索神器!Listary简介Listary是一款非常实用的搜索工具,它可以为“我的电脑”(资源管理器)添加许多智能命令,包括收藏文件夹、快速打开最近浏览的文件夹、快速显示/隐藏文件扩展名等功能。这些实用功能可以帮助你在日常收藏和整理文件时提高效......
  • 淘宝图片搜索商品数据api接口对接详细的描述和解释
    淘宝图片搜索商品数据接口是一项高级的API服务,它允许用户通过上传图片来搜索淘宝上的商品。这一功能依托于先进的图像识别技术,通过复杂的算法对上传的图片进行分析和处理,从而找到与图片相似的商品。以下是对该接口的详细描述和解释:主要功能、特点、优势主要功能:以图搜图......
  • codeforces round 974(div.3)E(优先队列实现dijstra算法,devc++的优先队列用greater报
    解题历程:看到两边同时移动,计算最终的相遇时间,我就想到两边同时计算各点到起点的最短距离,就是使用dijstra算法,最后所有节点取两次计算的最大值,再对所有节点取最小值,就是最终答案了,可是这个思路没有考虑有马的情况,思考一番后发现可以多列一个数组记录有马的情况下的行走最短路,然后......