矩阵类dfs

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值