枚举排列

来源:互联网 发布:沈阳专业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
原创粉丝点击