全排列的三种方法(递归)

把abc全排列

方法 一:

可以看做a为前缀,bc全排列,(a与b交换)b为前缀,ac全排列,(a与c交换)c为前缀,ba全排列

在递归的时候bc全排列可看成,b为前缀,c全排列,c为前缀b全排列。

特点:明显的看出这样排列的结果不是从小到大的

代码:

//数组存到a[0]-a[n-1],调用perm(0,n)
void perm(int b,int e){
    if(b==n-1){
        //输出
        return ;
    }
    for(int i=b;i

方法二:

用vis数组标记,不用像方法一那样交换,而是每次都遍历所有元素,若vis[i]==0,则选中a[i]

特点:若a数组是有序的,则输出的结果也是有序的(结果从小到大)

//数组存到a[0]-a[n-1],调用perm(0)
void perm(int step){
    if(step==n){
        //输出b
        return ;
    }
    for(int i=0;i

方法三:用next_permutation

特点:若初始数组有序,则输出的的结果也是有序

string a;
cin>>a;
do{
    cout<

你可能感兴趣的:(dfs,信息学奥赛一本通)