深度优先搜索算法(英语: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;
}