🙃

在递归的过程中会生成以下路径,每一条从根节点到叶子结点的路径都是一个排列

//即排列为
[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;
}