首页 > 代码库 > 枚举排列
枚举排列
字典序排列:一个个的递归填充;
1:1-n的全排列
int n; void permutation(int cur,int *A) { if(cur==n) { for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); return; } for(int i=1;i<=n;i++) { int ok=0; for(int j=0;j<cur;j++) //判断前面是否出现过 if(A[j]==i){ ok=1; break; } if(ok==0) { A[cur]=i; permutation(cur+1,A); } } }
2:可重集的全排列
int p[100]; int n; void permutation(int cur,int *A) { if(cur==n) { for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); system("pause"); return ; } for(int i=0;i<n;i++) { if(!i||p[i]!=p[i-1]) //注意,防止出现重复 { int c1=0,c2=0; //计数器 for(int j=0;j<cur;j++) if(p[i]==A[j]) c1++; for(int j=0;j<n;j++) if(p[j]==p[i]) c2++; if(c1<c2) { A[cur]=p[i]; permutation(cur+1,A); } } } } int main() { int A[100]; p[0]=1; p[1]=2; p[2]=3; p[3]=3; p[4]=3; p[5]=4; p[6]=5; n=7; permutation(0,A); return 0; }
枚举排列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。