第七章按字典序全排列

 

 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 //生成可重集的排列
 7 
 8 
 9 void print_permutation(int n,int* p,int* A,int cur)
10 {
11     if(cur==n)
12     {
13         for(int i=0;i<n;i++)
14             printf("%d ",A[i]);
15 
16         printf("\n");
17     }
18     else
19     {
20         for(int i=0;i<n;i++)
21         {
22             if(!i || p[i]!=p[i-1])                  //不重复不遗漏任何一个P[i]值
23             {
24                 int ca=0;
25                 int cp=0;
26 
27                 for(int j=0;j<n;j++) if(p[i]==p[j]) cp++;
28                 for(int j=0;j<cur;j++) if(p[i]==A[j]) ca++;
29 
30 
31                                             //A中的某个值应该小于P中该值的个数才能执行
32                                             //用于判断某个值还能否使用
33                 if(ca<cp)                                
34                 {
35                     A[cur]=p[i];
36 
37                     print_permutation(n,p,A,cur+1);
38                 }
39             }
40         }
41     }
42 }
43 
44 int main()
45 {
46     int A[100];
47     int p[100];
48 
49     int n;
50     cin>>n;
51 
52     for(int i=0;i<n;i++) scanf("%d",&p[i]);
53 
54     print_permutation(n,p,A,0);
55 
56     return 0;
57 }
58 
59 
60 //跳过代码本身去看算法,这就和具体实现没关系了,无论什么语言,什么结构

 

思路就是书上写的从小到大取P中值v插到当前,当然v要是没用过的或者说是没用完的

当有重复时要跳过重复的值

 

利用stl快速实现

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int p[10];
 8 
 9 int main()
10 {
11     int n;
12     cin>>n;
13 
14     for(int i=0;i<n;i++) scanf("%d",&p[i]);
15 
16     sort(p,p+n);
17     
18     do
19     {
20         for(int i=0;i<n;i++) printf("%d ",p[i]);
21 
22         printf("\n");
23     }while(next_permutation(p,p+n));
24 
25     return 0;
26 }

 

posted @ 2017-08-22 16:58  lan126  阅读(109)  评论(0编辑  收藏  举报