[dfs入门]全排列问题
first:题目
描述
输出自然数
输入
输入一个数字
输出
由
second:分析
直接递归即可。
设
当全部枚举完后,即
third:新知
我们可以开一个
枚举时,我们先判断有没有用,如果没有用过,就加入,并且这个数变成
当这个数递归完以后,再把这个数变成
fourth:注意
1、为了不重复,要设数组表示状态。
2、及时回溯,以便下次搜索。
3、当搜到第
fifth:代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[101];
bool node[101];
void write()
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;//输出
}
void dfs(int dep)
{
if(dep==n+1)//搜索完了
{
write();
return;
}
for(int i=1;i<=n;i++)
{
if(node[i]==false)//没有用过
{
a[dep]=i;
node[i]=true;//使用
dfs(dep+1);//下一个数
node[i]=false;//回溯
}
}
}
int main()
{
cin>>n;
dfs(1);//从第一层开始
return 0;
}