🙃
在递归的过程中会生成以下路径,每一条从根节点到叶子结点的路径都是一个排列
//即排列为
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]
#include<bits/stdc++.h>
using namespace std;
int N,visit[100]; //visit用来判断该数是否已被访问
vector<int>path; //存放路径的数组
void dfs(vector<int>&path,int visit[]){
if(path.size()==N){ //当数组path内元素的个数等于N时,说明已生成一个的排列,即可打印出来
for(int i=0;i<path.size();i++){
cout<<path[i]<<' ';
}
printf("\n");
}
for(int i=1;i<=N;i++){
if(visit[i]==0){ //如果该数未被访问
path.push_back(i); //把它加到路径中
visit[i]=1; //标记已访问
dfs(path,visit); //对加入该数后的路径继续进行DFS
path.pop_back(); //该数递归完后,把该数弹出来
visit[i]=0; //把该数的访问重新标记为0,以便其他位数能继续访问
}
}
}
int main(){
cin>>N;
dfs(path,visit);
return 0;
}