- 深度优先算法是一种搜索算法,在已知空间中,搜索出所有可能的结果,for循环也可以达到同样的效果,但是它的时间的复杂度远高于深度优先算法。
- 深度优先算法的核心是递归操作,其思想为:解决当下该如何做,至于下一步该如何做,与当下相同。
- 下面我们来看一个实例,一个数的全排列。暴力解法直接使用嵌套使用for循环,这里当然是使用深度优先来解决啊。
#include<stdio.h>
int a[10],book[10],n; //a数组是记录排列顺序,book数组记录那些数已经排列过了。
void dfs(int step) //当前排第几个数
{
int i;
if(step == n+1) //判断是否已经排完
{
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
for(i=1;i<=n;i++) //递归排序。
{
if(book[i]==0)
{
a[step] = i;
book[i] = 1; //标记那些数已经排序过了。
dfs(step+1);
book[i] = 0; //取消已经标记过的数字。
}
}
return ;
}
int main(void)
{
scanf_s("%d",&n); //多少个数的全排列
dfs(1);
return 0;
}
2.下面再来看看第二个例子,三位数的加法(其和也是三位数)的所有可能。其思想与核心代码与上面的基本相同,只是当下要做的事情不同而已。
1 #include<stdio.h>
2
3
4 int a[51],book[51];
5
6 void dfs(int step)
7 {
8 int i;
9 if(step==10)
10 {
11 if((a[1]*100+a[2]*10+a[3])+(a[4]*100+a[5]*10+a[6])==(a[7]*100+a[8 ]*10+a[9]))
12 { printf("%d%d%d+%d%d%d=%d%d%d",a[1],a[2],a[3],a[4],a[5],a[6],a[7 ],a[8],a[9]);
13 printf("\n");
14 }
15 return;
16 }
17
18 for(i=1;i<=9;i++)
19 {
20 a[step] = i;
21 book[step] = 1;
22 dfs(step+1);
23 book[step];
24 }
25 }
26
27 int main(void)
28 {
29 dfs(1);
30 return 0;
31 }
看了上面两个例子,我们应该对深度优先算法有了一定的了解,其核心是递归操作,下一步的操作与当前的操作一样,但要记住:递归递归,归去来兮。