枚举排列
来源:互联网 发布:沈阳专业seo公司 编辑:程序博客网 时间:2024/05/22 02:46
输入p数组(没有相等元素)的全排列
void print_permutation(int n,int cur){ if(cur==n) {for(int i=0;i<n;i++) printf("%d ",a[i]);printf("\n");} else for(int i=0;i<n;i++){ int ok=1; for(int j=0;j<cur;j++) if(a[j]==p[i]) ok=0; if(ok) { a[cur]=p[i]; print_permutation(n,cur+1); } }}
输出p数组的全排列(可能有重复元素)
void print_permutation(int n,int cur){ if(cur==n) {for(int i=0;i<n;i++) printf("%d ",a[i]);printf("\n");} else for(int i=0;i<n;i++) if(!i||p[i]==p[i-1]) { int c1=0,c2=0; for(int j=0;j<n;j++) if(p[i]==p[j]) c1++; for(int j=0;j<cur;j++) if(a[j]==p[i]) c2++; if(c1>c2) { a[cur]=p[i]; print_permutation(n,cur+1); } }}
然后是全排列的stl里的库函数,next_permutation,不论p有没有重复的
int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&p[i]); sort(p,p+n); do{ for(int i=0;i<n;i++) {printf("%d ",p[i]);} printf("\n"); }while(next_permutation(p,p+n)); return 0;}
0 0