1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列

打个比方:(1)类似于树的按层次遍历

     (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果没有,再摸远一点的地方……

 BFS算法:

 通常用队列(先进先出,FIFO)实现

 初始化队列Q;
Q = {起点s};
标记s为已访问;
while(Q非空)
{
取Q队首元素u;
u出队;
if(u==目标状态)
{
……
}
else
{
所有与u相邻且未被访问的点进入队列;
标记u为已访问;
}
}
 //BFS算法框架
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std; const int maxn = ;
bool mark[maxn][maxn]; //访问标记
int go[][] = {,-,,,,,-,}; //方向向量 struct State
{
int x,y; //坐标位置
int step; //搜索步数记录
}; State maze[maxn]; bool CheckState(State s)
{
if(!mark[s.x][s.y]&&(边界条件满足)) //符合条件
return ;
else //不符合条件
return ;
} void BFS(State st)
{
queue<State> q;
State now,next;
st.step = ; //步数清零;
q.push(st); //入队;
mark[st.x][st.y] = ; //访问标记
while(!q.empty())
{
now = q.front(); //取队首元素进行拓展
q.pop(); //队首元素出队;
if(now == 目标状态) //出现目标状态,此时的step为最小值,做做相关处理后退出即可;
{
……;
return ;
}
//如果没有到目标状态:
else
{
for(int i=;i<;i++)
{
next.x = now.x + go[i][];//按照规则生成下一个状态
next.y = now.y + go[i][];
if(CheckState(next)) //如果状态满足条件则入队;
{
next.step = now.step + ;
q.push(next);
}
}
}
return ;
}
} int main()
{
……;
BFS();
……;
return ;
}

DFS (深度优先搜索):一直往下搜,知道找到解或者走不下去为止

打个比方:(1)类似于树的先根遍历

     (2)类似于你在走迷宫,你不能分身来站在每个走过的位置,所以,你只能不撞南墙不回头。

 DFS:

 使用栈来保存未被检测的节点,
节点按照深度优先的次序被访问并依次压入栈中,并已相反的次序出栈进行新的检测。 DFS(dep,……)//dep代表目前DFS的深度
{
if(找到解||走不下去了)
{
……;
return;
}
else
{
枚举下一种情况;
DFS(dep+,……);
}
}
 //DFS算法框架:

 #include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std; const int maxn = ;
bool mark[maxn][maxn]; //访问标记
int maze[maxn][maxn]; //坐标范围
int go[][] = {,-,,,,,-,}; //方向向量 bool CheckState(int x,int y)
{
if(!mark[x][y]&&……) //满足条件
return ;
else //与约束条件冲突
return ;
} void DFS(int x,int y)
{
mark[x][y] = ; //标记该节点被访问过
if(maze[x][y] == G) //出现目标状态G
{
…… //做相应处理
return ;
}
else
{
for(int i=;i<;i++)
if(CheckState(x+go[i][],y+go[i][])) //按照规则生成下一个节点
DFS(x+go[i][],y+go[i][]);
}
return ; //如果没有下层搜索点,则回溯;
} int main()
{
……;
return ;
}

通俗理解BFS和DFS,附基本模板的更多相关文章

  1. 聊聊算法——BFS和DFS

    如果面试字节跳动和腾讯,上来就是先撕算法,阿里就是会突然给你电话,而且不太在意是周末还是深夜, 别问我怎么知道的,想确认的可以亲自去试试.说到算法,直接力扣hard三百题也是可以的,但似乎会比较伤脑, ...

  2. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  3. 借助leetcode题目来了解BFS和DFS

    广度优先和深度优先搜索 前言 看着这两个搜索的前提的是读者具备图这一数据结构的基本知识,这些可以直接百度一波就了解了.图也像树一样,遍历具有很多的学问在里面,下面我将借用leetcode的题目讲解一下 ...

  4. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  5. 算法录 之 BFS和DFS

    说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...

  6. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  7. SPFA算法的判负环问题(BFS与DFS实现)

    经过笔者的多次实践(失败),在此温馨提示:用SPFA判负环时一定要特别小心! 首先SPFA有BFS和DFS两种实现方式,两者的判负环方式也是不同的.       BFS是用一个num数组,num[x] ...

  8. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  9. HDU-4607 Park Visit bfs | DP | dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...

随机推荐

  1. ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [

    一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...

  2. 多个Firefox共存&&彻底关闭自动更新

    安装 0x001 下载好要安装Firefox的版本 可到Firefox官方仓库下载 https://ftp.mozilla.org/pub/firefox/releases/ 我下载的是42和56版 ...

  3. 手动安装 pygame

    在windows下 用pip 安装pygame,老是失败,下载了 wheel文件,用pip安装还是不行,查了一下资料,可以手动安装: 1.在 http://www.lfd.uci.edu/~gohlk ...

  4. 1934. [SHOI2007]善意的投票【最小割】

    Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可 ...

  5. 【[BJOI2017]魔法咒语】

    矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数 ...

  6. centos安装swoole

        编译安装swoole: cd && wget https://github.com/swoole/swoole-src/archive/1.8.6-stable.tar.gz  ...

  7. 【转】纯JS省市区三级联动(行政区划代码更新至2015-9-30)

    本文代码实现的功能是省市区三级联动下拉列表,纯Javascript,网上已有很多这方面的代码.但是作为一个新手,这是我的第一篇CSDN博客,发此文的目的主要是学习交流,希望看到的朋友发现有什么不对的地 ...

  8. oracle 基本知识点

    //创建临时表空间create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\oradata\testserver ...

  9. 记录一下mac上码云的使用

    项目比较多的时候用第三方的托管平台管理自己的代码还是挺不错的,记录一下码云的基本使用 分两部分进行说明: 一 :怎么上传自己本地的代码到码云.(方式,通过终端输入命令行) 具体的步骤: 1 :首先得在 ...

  10. grep 搜索多个同时满足的条件

    (二) Grep AND 操作 1. 使用 -E 'pattern1.*pattern2' grep命令本身不提供AND功能.但是,使用 -E 选项可以实现AND操作.   grep -E 'patt ...