这段代码是有关与实现从正整数1到n的全排列
学习中我发现dfs中最难理解的一步就是回溯,所以我先写出了不带有回溯的代码,如下
#include<bits/stdc++.h>
using namespace std;
int n=0;
int a[77];//存放结果
int book[5];//数组初始化每个元素均为0,可以把0当作未使用,1当作已经使用
void dfs(int step)//step表示进行到了第几步
{
if(step==n+1)//递归的结束条件
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<' ';//输出结果
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(book[i]==0)//表示未使用
{
a[step]=i;
book[i]=1;//已经使用
dfs(step+1);//继续递归下一层
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
输出结果为1 2 3
很明显,没有了回溯只会输出其中一个答案,先稍安勿躁,让我们来详细看看这段递归是如何进行的,(先默认输入的n为3),首先,1传递到了dfs函数中,此时step为一,不满足递归结束条件,
进行下面的for循环,由于book数组初始化全为0,先使得a[step]赋值1,然后使book【1】赋值1,表示该位置已经使用,而后进行下一层递归,dfs(2);
此时book【1】为1,for循环从2开始,使得a[2]=2,再次递归dfs(3),1,2均已经使用,使得a[3]=3,dfs(4),至此,递归结束,打印1 2 3,运行结束
但如果加上回溯呢
#include<bits/stdc++.h>
using namespace std;
int n=0;
int a[77];//存放结果
int book[5];//数组初始化每个元素均为0,可以把0当作未使用,1当作已经使用
void dfs(int step)//step表示进行到了第几步
{
if(step==n+1)//递归的结束条件
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<' ';//输出结果
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(book[i]==0)//表示未使用
{
a[step]=i;
book[i]=1;//已经使用
dfs(step+1);//继续递归下一层
book[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
输出即为六种全排列