深度优先搜索

#include<stdio.h>
int a[10],book[10],n;//全局变量默认为0 
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++)//n=2 i=1      i=2     i=2
  {
    if(book[i]==0)
    {
      a[step]=i;    //a[1]=1   a[2]=2     a[]
      book[i]=i;
      
      dfs(step+1); //
      book[i]=0;//收回的i是多少 ?     book[2]=0 book[1]=0
    }           //在第n次调用中结束并收回n 跳出递归后再收回n-1 
  }
  return;
 } 
int main()
{
  scanf("%d",&n);
  dfs(1);
  
}
//深度优先搜索,类似贪心,关键在于  解决当下如何去做  而下一步的做法与
//上一步相同 

深度就是根据一条最简单的路线走到最深的一层,然后变倒数第一层,再变倒数第二层和倒数第一层,从低向高增加变的层数,一层一层向上搜索。
通过递归实现了n次的循环嵌套,并且通过对标记值的收回跳过了重复情况

深度搜索遍历图
在这里插入图片描述

#include<stdio.h>
int book[101],sum,n,e[101][101];
void dfs(int cur)
{
  int i;
  printf("%d ",cur);
  sum++;
  if(sum==n)  return ;
  for(i=1;i<=n;i++)
  {
    if(e[cur][i]==1 && book[i]==0)
    {
      book[i]=1;
      dfs(i);
    }
  }
  return;
}
int main()
{
  int i,j,m,a,b;
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      if(i==j) 
        e[i][j]=0;
      else
        e[i][j]=99999999;
  for(i=1;i<=m;i++)
  {
    scanf("%d%d",&a,&b);
    e[a][b]=1;
    e[b][a]=1;    
  } 
  book[1]=1;
  dfs(1);
  return 0;
  
} 
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页