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. 转贴:C语言链表基本操作

    http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...

  2. echarts问题

    1.鼠标经过折线图  显示的框中的文字设置,需要设置tooltip下的formatter属性 formatter属性值可以为字符串也可function formatter:function(data) ...

  3. [HAOI2018]奇怪的背包

    题目 暴力\(dp\)好有道理啊 于是我们来个反演吧 考虑一个体积序列\(\{v_1,v_2,...v_n\}\)能凑成\(w\)的条件 显然是 \[v_1x_1+v_2x_2+...+v_nx_n\ ...

  4. leetcode 217. Contains Duplicate 287. Find the Duplicate Number 442. Find All Duplicates in an Array 448. Find All Numbers Disappeared in an Array

    后面3个题都是限制在1-n的,所有可以不先排序,可以利用巧方法做.最后两个题几乎一模一样. 217. Contains Duplicate class Solution { public: bool ...

  5. Python读文件报错:SyntaxError: Non-ASCII character in file

    打开city.py文件时报错 问题原因: 程序中的编码错误,python默认是acii模式,没有支持utf8.如果代码中有汉字 ,就会报错 解决方案: 源代码文件(city.py)第一行添加:#cod ...

  6. 初识Qt布局管理器

    Qt布局管理器的类有4种,它们分别为QHBoxLayout.QVBoxLayout.QGridLayout和QStackLayout.其中,QHBoxLayout实现水平布局,QVBoxLayout实 ...

  7. 论文笔记 CVPR-2014 DeepReID Deep filter pairing neural network for person re-identification

    1. 摘要 第一篇用深度学习做Reid的文章,提出的FPNN采用端到端的训练方式,解决行人再识别的不对齐,光照,姿态等问题. 建立了一个新的带benchmark的数据集CUHK03,表现性能良好. 2 ...

  8. linux文件系统初始化过程(1)---概述

    术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 st ...

  9. MySQL添加、删除索引

    1.索引类型 UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值: INDEX(普通索引):允许出现相同的索引内容: PROMARY KEY(主键索引):不允许出现相同的值: fullte ...

  10. Linux用户管理及用户信息查询

    useradd 创建用户,更改用户信息 1.工作原理流程 使用此命令式,若不加任何参数选项,直接跟用户名,那么系统会首先读取/etc/login.defs(用户定义文件)和/etc/default/u ...