dfs理解1

dfs为深度搜索,我的理解是一条路走到黑(不撞南墙不回头),其实和函数的递归一样,当然可以用栈来实现,但一般用函数的递归来实现。

个人感觉和二叉树的前序遍历有点像,就是一个一个的排查路并去除不符合规定的路。

但是和bfs不同,bfs是一层一层的遍历,就相当于在清水中滴入一滴墨水一样。从中心向四周扩散

这几天学习了一点dfs,说一下我的理解。

1:dfs感觉是运用在求联通问题和能走的最大步数的问题上(其他的我还没学到)

      1:联通问题

例如:

 

 

 

这类的题目,一般就是求联通的数量,有的题目联通的方式不同,有的是上下左右,有的还可以对角线走。原理都相同

解题思路:找到一个@后用dfs搜索并在计数器上加一,这里要注意搜索的过程中要将已经搜索过的要变成*这里要防止第二次的访问,然后就是编写dfs函数,因为是递归函数,所以要编写递归推出的条件(很重要),然后就是让它进行dfs深度搜索,也就是递归,同时这里要注意,编写的是带返回值的函数,还是不带的,这里我老错,如果是带返回值的函数,就一定不要忘记返回值,因为有时候要根据返回值结束递归(有的题目可呢超时)

下面附上我的代码:

#include <iostream>
using namespace std;
const int maxn=105;
char field[maxn][maxn];
int cnt,m,n;
void dfs(int x,int y)
{
    field[x][y]='*';
    for(int i=-1; i<2; i++)
        for(int j=-1; j<2; j++)
        {
            int xx=x+i;
            int yy=y+j;
            if(xx>=0&&yy>=0&&xx<m&&yy<n&&field[xx][yy]=='@')
                dfs(xx,yy);
        }
}
int main()
{
    while(cin>>m>>n)
    {
        if(m==0&&n==0)break;
        cnt=0;
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                cin>>field[i][j];
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                if(field[i][j]=='@')
                {
                    dfs(i,j);
                    cnt++;
                }
        cout<<cnt<<"\n";
    }
    return 0;
}
如果我有理解错的,请指出,谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值