版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23301703/article/details/88604524
感觉编程的时候是孰能生巧,之前对于dfs一直觉得是高大上的样子,直到最近敲了几次后发现总是有套路的,总结套路如下
首先有3个全局变量
1.visit 数组 标记走过的内容
2.flag 数组 标记数组是否走过
3.m,n 是一个全局变量 用作于遍历中的step,也就是用于试探下一步是否可走
其次
dfs 会调用本身 大体结构
void dfs(int n)
{
if(n==)//步数达到
return;
else{
判断 flag 是否访问
否
{
flag置为访问
记录访问位置
dfs(step-1)
flag回溯置为未访问
}
}
}
在总结完上述后举两个dfs实例
实例给定一个数,输出一个数的全排列。
#include<stdio.h>
//设置 访问控制数组 与 访问控制标记
int visit[100]={0};
int flag[100]={0};
int n;
//dfs部分 参数为具体step
void dfs(int step)
{
//倒叙排列如果到0则输出访问数组
if(step==0)
{
for(int i=0;i<=n;i++)
{
printf("%d ",visit[i]);
}
printf("\n");
}
//对于n个数的空间进行排列
for(int i=n;i>=1;i--)
{
if(flag[i]==0)
{
flag[i]=1;
visit[step]=i;
dfs(step-1);
flag[i]=0;
}
}
}
int main()
{
while(scanf("%d",&n)!=0)
{
dfs(n);
}
}