hello,小伙伴们,大家好,今天和大家介绍的是基础的深度优先搜索
先从一个例子入手:对三张牌的排序:一共有多少种排法
我们假设有三个盒子手上呢有三张牌,每个盒子仅能放一张牌,(我们设立一个放的规定:每到盒子前先放1,再放2,最后放3)
我们先走到一号盒子前,将牌1放进去,就这样下去到三号盒子,我们手中此时已经没有牌了,但是也形成了一种排列了,接下来我们需要收回此时盒子中的牌3,并且往后退到第二号盒子中,并且按照上述的规定在2号盒子中放下牌3(相同的排法排除掉),并前进到三号盒子中放下牌2,此时又形成了一种排法,并收回3号盒子中的牌2,继续后退(相同的排法排除掉),就这样的步骤生成所有排列/
接下来我们解决代码的第一个问题,向盒子中一一放牌,用for循环:
for(i=1;i<=n;i++)
{
a[step]=i;//将i号牌放到第step个盒子中
}
a数组用来表示盒子,step用来表示第几个盒子;我们还需要用book[]数组来标记放好的牌(也就是标记已经使用过的牌):
for(i=0;i<=n;i++)
{
if(book[i]==0)//识别该牌没有用过
{
a[step]=i;
book[i]=1;标记该牌已经用过
}
}
接下来我们需要解决第step+1个盒子,我们用一个dfs函数来表示:
void dfs(int step)
{
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);//用函数来递归调用自己
book[i]=0;//极其重要的一步,收回刚刚尝试过的牌才有牌进行下次排序
}
}
深度优先搜索的基本模型:
{
void dfs(int step)
for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1);
}
返回;
}
完整代码和需要注意的细节在下面:
}
#include<stdio.h>
int a[10],book[10],n;//全局变量的初始值为0
void dfs(int step)
{
int i;
if(step==n+1)//表示前n个盒子已经排好
{
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;//第i号牌已经不在手上
dfs(step+1);
book[i]=0;//收回刚刚尝试的牌才有下一步进行尝试
}
}
return;
}
int main()
{
scanf("%d",&n);
dfs(1);//先从1号盒子开始
}
本书采用的是<<啊哈,算法>>中的例题剖析,也推荐大家看,算是一本基础和有趣的算法入门书,对新人还是挺友好的
如有侵权,请联系本人