深度优先搜索算法

深度优先搜索算法(英语: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值