深度优先搜索算法
来源:互联网 发布:明星淘宝店叫什么名字 编辑:程序博客网 时间:2024/05/31 15:19
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
算法实现:利用函数栈来保存当前搜索路径中每个节点的状态,每搜索一个新节点,就标记此节点被使用并递归调用一次dfs函数,确定此节点在本路径中无法到达终点,则return上一级函数,更换下一节点
比如现在有标号为1 2 3的三个箱子 和 标号为1 2 3的扑克牌 每个箱子只能放一张扑克牌 那么有几种结果呢?
dfs算法的解决方式就是递归的调用dfs函数对每个扑克牌进行处理
#include <stdio.h>/* a[10]数组里保存的是每个箱子里的数字 book[10]作为标记数标识手上是否还有牌 * b[i] = 0 说明有牌 b[i] = 1说明无牌 * 未初始化的全局变量保存在bss段 会被初始化为0 所以这里无需再将其赋值为0 */int a[10],book[10],n;void dfs(int step){ int i; if (step == n+1) { /* 能运行到这 说明已经站在了n+1的盒子面前 表示前n个盒子已经放好扑克牌了 */ for (i = 1; i <= n; i++) { /* 输出一种排列 1-n号盒子中的扑克牌变好 */ printf("%d",a[i]); } printf("\n"); return; //返回之前的上一步(最近一次调用dfs函数的地方) } for (i = 1; i <= n; i++) { if (book[i] == 0) { /* book[i]==0说明手上还有i号扑克牌 */ a[step] = i; //将i号扑克牌放入step号的箱子里 book[i] = 1;//将i号扑克牌标号赋值为1 说明手上已经没有i号扑克牌 dfs(step + 1);//走到下一个箱子前面 进行一样的处理 book[i] = 0;//将刚才尝试的扑克牌收回才能进行下一次尝试 } } return;} int main(void){ scanf("%d",&n);/* 输入一个1-9的整数 */ dfs(1);/* 首先站在1号小盒子面前 */ return 0;}
0 0
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 【深度优先搜索算法】
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 算法---深度优先搜索
- 【算法】深度优先搜索
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索算法
- 深度优先搜索 广度优先搜索算法
- [ 算法 ] 深度优先搜索算法!
- 深度优先搜索(DFS)算法
- 算法 DFS深度优先搜索
- linux_shell之ls部分功能实现
- 如何高效编写微信小程序呢?来看看腾讯工程师这个方法
- vbs遍历文件夹中的文件和文件夹,及其子文
- 我们为什么需要SDN?
- 【亲测】Android ----waiting for debugger
- 深度优先搜索算法
- 39
- OpenGLES的简单应用绘图,以及照相机画面变色变形渲染(八)
- Android JNI 使用别人的.so类库(盗版美图秀秀)
- C# 反射
- 分区表 UDF
- [unity3D基础篇03]必备的3D数学基础2
- Java String intern方法介绍
- protobuf 嵌套消息的使用