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. November 10th 2016 Week 46th Thursday

    Live like you were dying, love because you do. 生如将逝,爱自本心. When faced with our darkest hour, hope is ...

  2. 团队作业4(Alpha版本)

    项目名称:音乐播放器 项目成员: 张慧敏(201421122032) 苏晓薇(201421031033) 欧阳时康(201421122050) 会议记录:  主要讨论任务的分配和实现过程中已实现和未实 ...

  3. QT 登录记住密码方法之一:Qt QSettings读写配置文件

    不过本文写的是明文保存,最好还是加密一下,以防文件被非法读取 /**登录初始化的时候处理这部分操作*/ Settings cfg("user.ini",QSettings::Ini ...

  4. kvo的observationInfo

    观察者信息的注册: <NSKeyValueObservationInfo 0x600000708d60> ( <NSKeyValueObservance 0x6000009143f0 ...

  5. Mysql数据库的mysql Schema 究竟有哪些东西& 手工注入的基础要领

    #查看数据库版本号 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.5.16-log | +- ...

  6. 1491. [NOI2007]社交网络【最短路计数】

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...

  7. 使用nginx替换Ingress

    总感觉k8s Ingress 不可控, 所以使用nginx 替换Ingress,还是比较简单的. apiVersion: extensions/v1beta1 kind: DaemonSet meta ...

  8. 关于HTML Button点击自动刷新页面的问题解决

    原因 button,input type=button按钮在IE和w3c,firefox浏览器区别: 1.当在IE浏览器下面时,button标签按钮,input标签type属性为button的按钮是一 ...

  9. Js apply()使用详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  10. P1004 方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...