全排列问题

一:全排列问题算法描述如下:


举例: 345的全排列分别为 345 354    435 453    534  543, 可见将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
又举例:45的全排列有 45 54 可见将第一个数分别与后面的数交换后输出即为45的全排列。
所以,对于一个很长一帮子的数,如123412414132,我们需要将1与后面所有的数交换输出,它又包含一个字问题即将2与后面所有的数交换输出,又包含3,4....,
知道3,2交换并输出,这是一个递归的过程,3,2交换输出完成后,就开始回退出栈。
这一系列过程相当于把一个大问题划分成好多小问题 。
二:代码如下:
#include <iostream>
#include <cstring>
using namespace std;

template <typename T>
void full_permutation(T list[], int cur, int end)       //cur和end都是下标值
{
    if(cur == end){
        for(int i=0; i<=end; ++i)
            cout<<list[i];
        cout<<endl;
    }
    else{                           
        for(int i=cur; i<=end; ++i){   //第一次递归时,每次i都和cur即当前下标相等,知道i==end输出,然后递归回去
            swap(list[cur], list[i]);
            full_permutation(list, cur+1, end);
            swap(list[cur], list[i]);
        }
    }
}

int main()
{
    char list[] = "abc";
    full_permutation(list, 0, strlen(list)-1);    
    return 0;
}
结果如下:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值