DFS(深度优先搜索),BFS(广度优先搜索)小总结

这周正在学习DFS和BFS。
体验中觉得这两个算法还是挺好用的,但是遇到某些数据大的情况就很容易超时。(所以到后面还是得学习一下如何优化,或者采用更佳的搜索方法来解决问题)
然后学习了一段时间,感觉基本上了解了DFS和BFS的基础实现原理以及应用(不过我认为还是得通过做题来培养自己的感觉,什么时候该采取DFS,什么时候该采用BFS),它们两者间各自的优势需要通过实际的问题来具体分析,根据它们各自的特点来应用于不同的问题中才能获得最优的性能。

总的来说,两者都是搜索方法 (这不是废话嘛!) ,但是两者的搜索方式却有极大的区别。
我将DFS比作莽夫,就是一条路莽下去,如果有分支路,就选择其中一条走下去,直到走到终点或者该点处没有路可以走了,这时候只能回头,走之前没有走过的分支,继续莽下去。
而BFS更像是水流。我们在最上层倒水下来,水会流向这个节点处的各个分支,逐层地开始搜索。

由于DFS的特性,我们会采用 递归的方式来实现。
具体模板:

void dfs()//参数用来表示状态,例如临界条件,达到终点的条件  
{
     
    if(到达终点状态)  
    {
     
        ...//根据题意添加  
        return;  
    }  
    if(越界或者是不合法状态)  
        return;  
    if(特殊状态)//剪枝(避免搜索不必要的地方)
        return ;
    for(扩展方式)  
    {
     
        if(扩展方式所达到状态合法)  
        {
     
            修改操作;//根据题意来添加  
            tag标记;  
            dfs();  
            还原tag标记;     // dfs很重要一点就是可能要采用回溯思想,视题目而定  
        }  

    }  
}  

例题: HDU 1241 油田问题
AC代码如下:

#include <iostream>
using namespace std;
const int maxn=1e3;
char a[maxn][maxn]; // 用来储存油田矩阵
int dir[8][2]=
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值