C++实现全排列

来源:互联网 发布:知进退明得失手抄报 编辑:程序博客网 时间:2024/06/06 02:51

问题描述:

       有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;}