一:全排列问题算法描述如下:
举例: 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;
}
结果如下: