問題描述: 有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;
}