深度优先搜索算法

来源:互联网 发布:明星淘宝店叫什么名字 编辑:程序博客网 时间: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
原创粉丝点击