二十.DFS
深度优先搜索 俗称暴搜,最重要的是顺序。
给定一个数字n,要求输出1到n所有数字的全排列,按照字典序输出
假设有三个数字,我们设定有三个空,接下来要做的就是依次把三个空填上。假设一棵树,每填好一个空,树就往下延伸枝丫。
当所有的空都填完了,就往回回溯。回溯的时候记得把所有用过的数都拿出来。
填空的时候,我们需要知道当前位置可以填上哪些数,即知道哪些数已经被用过了。
#include<iostream>
using namespace std;
const int N=10;
int n;
int path[N];
bool st[N];//判断哪些数已经被用过了
void dfs(int u){
if(u==n){//说明所有空都填完了,这里开始输出结果
for(int i=0;i<n;i++) printf("%d",path[i]);
puts("");
return;
}
for(int i=1;i<=n;i++){
if(!st[i]) //如果没有被用过
{
path[u]=i;//把i填入
st[i]=true;//i已经被填过了
dfs(u+1);//递归
st[i]=false;//当递归结束,说明这一条空已经被填完了,回溯,把所有用过的数都“取出来”
}
}
}
int main(){
cin>>n;
dfs(0);
return 0;
}