全排列问题

来源:互联网 发布:cmmb电视模块软件 编辑:程序博客网 时间:2024/05/18 11:47

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



举例: 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 0
原创粉丝点击