1. 程式人生 > >C語言實現全排列

C語言實現全排列

one ide %d mut ota 技術 最大值 span space

一、遞歸實現全排列

技術分享圖片
 1 #include"cstdio"
 2 int A[50];
 3 void print_permutation(int n,int *A,int cur){
 4         if(cur==n){
 5         for(int i=0;i<n;i++)
 6             printf("%d",A[i]);
 7         printf("\n");
 8         }
 9         else for(int j=1;j<n+1;j++){
10         int ok=1;
11         for
(int k=0;k<cur;k++) 12 if(A[k]==j) 13 ok=0; 14 if(ok){ 15 A[cur]=j; 16 print_permutation(n,A,cur+1); 17 } 18 } 19 } 20 int main(){ 21 int n; 22 scanf("%d",&n); 23 print_permutation(n,A,0); 24 return
0; 25 }
View Code

二、解答樹

技術分享圖片
 1     #include <string.h>
 2     #include <iostream>
 3      
 4     using namespace std;
 5     const int N = 99999999;     //輸入排序的個數的最大值
 6     int record[N];              //記錄每次排序的序列
 7     int visited[N];             //標記節點是否被訪問過
 8     int n;                      //
輸入節點的數目 9 int totalSize = 0; 10 void DFS(int start){ 11 if(start>=n){ //遞歸出口 12 for(int i=0;i<n;i++){ 13 cout<<record[i]<<" "; 14 } 15 totalSize++; 16 cout<<endl; 17 return; 18 } 19 for(int i=1;i<=n;i++){ //深度遍歷節點,並標記已經訪問過的節點 20 if(visited[i]==0){ 21 visited[i] = 1; 22 record[start] = i; 23 DFS(start+1); //遞歸遍歷 24 visited[i] = 0; //回退時標記回退的節點為未被訪問節點 25 } 26 } 27 } 28 29 int main() 30 { 31 cin>>n; 32 memset(visited,0,n); 33 DFS(0); 34 cout<<"totalSize = "<<totalSize<<endl; 35 return 0; 36 }
View Code

三、

調用next_permutation()方法

C語言實現全排列