#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;
}