问题描述:
有n个元素,我们的目的是生成这n个元素的全排列。
算法设计思路:
(1)将规模为n的排列问题转化为规模为n-1的排列问题;
(2)将规模为n-1的排列问题转化为规模为n-2的排列问题;
(3)以此类推。
针对具体问题可以这么理解:(这里假设a[ ]={1,2,3,4,.....})
(1)如果n=1,很显然,n的全排列为{1};
(2)如果n=2,即a[]={1,2},n的全排列为
{2,1}——>a[1]和a[2]交换,再求{2}的全排列,即归于步骤1;
{1,2}——>a[2]和a[2]交换,再求{1}的全排列,即归于步骤1;
(3)如果n=3,即a[]={1,2,3},n的全排列为
{{3,2},1}——>a[1]和a[3]交换,再求{3,2}的全排列,即可归于步骤2;
{{1,3},2}——>a[2]和a[3]交换,再求{1,3}的全排列,即可归于步骤2;
{{1,2},3}——>a[3]和a[3]交换,再求{1,2}的全排列,即可归于步骤2;
......
以此类推。
代码如下:
#include <iostream>
using namespace std;
int n;
int sum=0;
//数据互换
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//输出结果
void result(int a[]){
sum++;
cout<<sum<<endl;
for(int i=0;i<n;i++){
cout<<a[i];
}
cout<<endl;
}
//实现全排列核心算法
void Perm(int a[],int n){
int i;
if(n==1){
result(a);
}
else{
for(i=0;i<n;i++){
swap(a[i],a[n-1]);
Perm(a,n-1);
swap(a[i],a[n-1]);
}
}
}
//主函数
int main(){
int a[101];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
Perm(a,n);
return 0;
}