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 }
转载于:https://www.cnblogs.com/tclan126/p/7412475.html
相关资源:数据结构—成绩单生成器