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