程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++實現全排列

C++實現全排列

編輯:C++入門知識

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

 

   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved