DFS 算法

思想:一直往深处走,直到找到解或者走不下去为止
BFS算法
DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。
BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进出队列。
框架:
BFS:
#include<cstdio>

#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100;
bool vst[maxn][maxn]; // 访问标记
int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量
struct State // BFS 队列中的状态数据结构
{
int x,y; // 坐标位置
int Step_Counter; // 搜索步数统计器
};
State a[maxn];
bool CheckState(State s) // 约束条件检验
{
if(!vst[s.x][s.y] && ...) // 满足条件
return 1;
else // 约束条件冲突
return 0;
}
void bfs(State st)
{
queue <State> q; // BFS 队列
State now,next; // 定义2 个状态,当前和下一个
st.Step_Counter=0; // 计数器清零
q.push(st); // 入队
vst[st.x][st.y]=1; // 访问标记
while(!q.empty())
{
now=q.front(); // 取队首元素进行扩展
if(now==G) // 出现目标态,此时为Step_Counter 的最小值,可以退出即可
{
...... // 做相关处理
return;
}
for(int i=0;i<4;i++)
{
next.x=now.x+dir[i][0]; // 按照规则生成 下一个状态
next.y=now.y+dir[i][1];
next.Step_Counter=now.Step_Counter+1; // 计数器加1
if(CheckState(next)) // 如果状态满足约束条件则入队
{
q.push(next);
vst[next.x][next.y]=1; //访问标记
}
}
q.pop(); // 队首元素出队
}
return;
}
int main()
{
......
return 0;
}
DFS:
DFS:
/*
该DFS 框架以2D 坐标范围为例,来体现DFS 算法的实现思想。
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=100;
bool vst[maxn][maxn]; // 访问标记
int map[maxn][maxn]; // 坐标范围
int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量,(x,y)周围的四个方向
bool CheckEdge(int x,int y) // 边界条件和约束条件的判断
{
if(!vst[x][y] && ...) // 满足条件
return 1;
else // 与约束条件冲突
return 0;
}
void dfs(int x,int y)
{
vst[x][y]=1; // 标记该节点被访问过
if(map[x][y]==G) // 出现目标态G
{
...... // 做相应处理
return;
}
for(int i=0;i<4;i++)
{
if(CheckEdge(x+dir[i][0],y+dir[i][1])) // 按照规则生成下一个节点
dfs(x+dir[i][0],y+dir[i][1]);
}
return; // 没有下层搜索节点,回溯
}
int main()
{
......
return 0;
}

BFS和DFS算法原理(通俗易懂版)相关推荐

  1. python dfs算法_LeetCode | 一文帮你搞定BFS、DFS算法(python版)

    模板方法 使用BFS,DFS的题目,在leetcode上一般标记为medium或者hard.但从思维逻辑上看,其难度定义偏高.可能从代码量来看,写一道BFS或者DFS的篇幅比其他类型的题目要多. BF ...

  2. Python BFS和DFS算法

    Python BFS和DFS算法 看了b站灯神的视频,整理如下.最后再加上几条实战题. 1.BFS bfs全称是广度优先搜索,任选一个点作为起始点,然后选择和其直接相连的(按顺序展开)走下去.主要用队 ...

  3. DFS算法原理及其具体流程,包你看一遍就能理解

    目录 写在前面 DFS算法 所解决的问题 所需要的数据结构 代码结构及解释 方法一:递归 解释 递归dfs总结 方法二:栈 解释 栈dfs总结 写在前面 因为楼主也是刚开始刷leetcode,所以下面 ...

  4. python之多继承广度优先C3算法原理通俗易懂的讲解

    python多继承比较复杂,python2的多继承查找顺序是深度优先,pyhon3的多继承查找顺序是采取C3算法的广度优先. C3算法原理: python解释器每遇到一个类就会按广度优先的原则将其父类 ...

  5. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  6. BFS和DFS优先搜索算法

    4.教你通透彻底理解:BFS和DFS优先搜索算法 作者:July  二零一一年一月一日 --------------------------------- 本人参考:算法导论  本人声明:个人原创,转 ...

  7. 分享两个常见的搜索算法:BFS和DFS

    本文分享自华为云社区<BFS和DFS算法初探>,作者: ayin. 本次分享两个常见的搜索算法 1.BFS 即广度优先搜索 2.DFS 即深度优先搜索 岛屿数量 给定一个由 '1'(陆地) ...

  8. 拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法

    拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法 Kahn 算法 DFS 算法 拓扑排序(TopoSort)有相当广泛的应用,比如依赖关系分析.图是否有环的检测.编译 ...

  9. ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(三)

    本文为:ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第三篇 深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一) 深度优先算法(DF ...

最新文章

  1. UML中符号的意义(转)
  2. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解
  3. C++11 std::bind 和 std::placeholder
  4. 【机器学习】集成学习之stacking
  5. viewDidLoad、viewWillAppear、viewWillDisappear
  6. API设计原则 - Qt官网的设计实践总结
  7. PHP培训选云和数据,送给云和数据郑州分中心PHP培训班全体学员的祝福
  8. coreldraw错误代码14001_CorelDRAW文件损坏的几种解决方法
  9. 在windows环境下ftp服务器的文件上传和下载
  10. 丈夫创业前后累计11次
  11. ADB介绍—— 配置ADB环境变量
  12. 10款最佳在线地图软件介绍
  13. spring报错ava.lang.NoClassDefFoundError:
  14. Rocketmq broker迁移方案
  15. [足式机器人]Part3机构运动微分几何学分析与综合Ch01-3 平面运动微分几何学——【读书笔记】
  16. 精确计算时,不要使用float或double
  17. HyperTech合泰集团介绍
  18. k8s内nginx设置dns无法访问外网
  19. 【开关电源】基于Simplis的开关电源仿真设计
  20. Ubuntu Linux 携手诺基亚进军手机操作系统市场

热门文章

  1. Oracle官方JDBC jar包下载
  2. GYctf-BFnote IO_FILE还可以这样利用
  3. 对访问和使用计算机的人员应釆取,计算机笔试模拟题全(含答案)
  4. Java面试题交流群
  5. 2021届前端面试知识点(其他)
  6. Maximum modulus principle and its corollary(Stein复分析)
  7. 堆内存(heap)和栈内存(stack)区别
  8. 不用看了,赶紧跟着敲一遍!
  9. c语言指针什么时候加星号,c语言中指针前面的星号,什么时候可以省去,什么时候又必须带上呢?(转载)...
  10. android bp文件_理解Android.bp