矩阵类dfs

这篇博客探讨了如何使用深度优先搜索(DFS)解决矩阵类问题,如计算岛屿数量和求解岛屿的最大面积。DFS在这些问题中展现出高效性,通过定义四个方向进行递归搜索,避免回溯。对于岛屿数量问题,可以在原数组上标记已遍历的陆地。对于最大面积问题,需要在满足条件时累加相邻岛屿的面积。文章提供了变形题目并解释了解题思路和代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dfs即深度优先搜索,正如名字所说,其是一种搜索方式,按照深度进行逐个搜索,dfs常用于回溯算法中,两者十分相似,只是,回溯法是实现方法,深度优先搜索是实现方式,同时在树的相关搜索中也会出现深度优先搜索方式,基本思想和回溯算法类似,不过有个最大不同点是回溯法需要在有回溯过程,而dfs不需要回溯,其只需向着满足条件大方向搜索,直到不满足条件为止。这里不再详细讲解算法的定义等理解性的东西,而是通过分析几个例题,得出解这类题目的模板。

岛屿数量

给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

输入:
11110
11010
11000
00000
输出: 1

输入:
11000
11000
00100
00011
输出: 3

很明显该题是搜索类的问题,而且不需要把每一项都枚举出来,因此可考虑dfs,特别是矩阵类的dfs,套路很固定,首先,需要定义四个方向,即每个位置的上下左右,对每个方向都进行判断是否满足继续向下搜索的条件,如果满足,那么就调用dfs递归函数进行递归调用,同时在进行每个方向选择时需要注意下个位置是否已经遍历过,因此,一般会需要一个额外的数组来存储某个位置是否已经被调用过,不过这道题显然可以不是使用额外数组,直接在原数组上将遍历过的数据置为0即可为了统计数量,需要在遍历开始时,对岛屿数量加一,代表这次遍历会经过属于该块岛屿的所有块,看懂解题思想后代码就很好实现了。

class Solution {
   
   
private:
//定义四个方向,上下左右,方向的顺序排列没有影响
    vector<vector<int>>dir={
   
   {
   
   1,0},{
   
   -1,0},{
   
   0,1},{
   
   0,-1}};
public:
//定义dfs递归函数
    void dfs(vector<vector<char>>& grid,int x,int y){
   
   
    //遍历过该位置后将该位置置为0,代表该位置已经遍历过
        grid[x][y]='0';
    //对矩阵的四个方向进行搜索
        for(int k=0;k<4;++k){
   
   
            int xx=x+dir
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值