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;//极其重要的一步,收回刚刚尝试过的牌才有牌进行下次排序
}
return;
}
完整代码和需要注意的细节在下面:
}
#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号盒子开始 
  } 
本书采用的是<<啊哈,算法>>中的例题剖析,也推荐大家看,算是一本基础和有趣的算法入门书,对新人还是挺友好的
如有侵权,请联系本人










