递归算法解决全排列问题

本文探讨了全排列问题,并提供了使用递归算法和深度优先搜索(DFS)解决该问题的方法。通过示例展示了如何对小写字母字符串进行字典序排列,并给出了样例输入和输出。
摘要由CSDN通过智能技术生成

全排列(permutation)的有关问题,拿数字为例(123的全排列)有
123 132
213 231
312 321
(1234的全排列)
1: 1234 1243 1324 1342 1423 1432 //黑体部分恰好为剩下三个数的全排列
2: 2134 2143 2314 2341 2413 2431
3: 3124 3142 3214 3241 3412 3421
4: 4123 4132 4213 4231 4312 4321

#include<iostream>
using namespace std;
void perm(int a[],int k,int m)//对数组a[]从k到m
{
    if(k==m)//已经排完一种情况并输出
    {
        cout<<a;
        cout<<endl;
    }
    else
        for(int i=k;i<=m;i++) 
        {swap(a[k],a[i]); 
         perm(a,k+1,m); //递归
         swap(a[k],a[i]);} //还原
 }
int main()
{
    int a[4];
    cin>>a;
    perm(a,0,3);
    return 0;
}

但此时输出结果的顺序,与预列的不一致
原因是代码中交换的步骤,比如当i=2时将a[0]与a[2]进行交换:
此时a[0]=3,再对a[1]到a[3](2,1,4)进行全排列,将会输出
3214
3241
3124

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值