生成排列的方法

来源:互联网 发布:谷歌优化排名 编辑:程序博客网 时间:2024/06/04 23:26

一、生成无重复元素的排列

#include <stdio.h>void pailie(int n,int *A,int cur,int *p)//利用递归进行调用{int i,j;if(cur==n){for(i=0;i<n;i++){printf("%d ",A[i]);}printf("\n");}elsefor(i=0;i<n;i++){int ok=1;//判断一个数在数组中是否重复出现的方法 for(j=0;j<=cur;j++){if(A[j]==p[i])//如果重复出现,令标记为0 ok=0;}if(ok)//如果没有重复出现,执行操作 {
A[cur]=p[i];//联想解答树,每一层的限制条件是p[i]在A[i]中没有出现重复。该层次已执行完毕,递归进行下一层次的选择
pailie(n,A,cur+1,p);}}}int main(){int p[3]={1,3,7} ;int A[4];pailie(3,A,0,p);return 0;}

二、生成有重复元素的排列

#include <stdio.h>void pailie(int n,int *A,int cur,int *p){int i,j;if(cur==n){for(i=0;i<n;i++){printf("%d ",A[i]);}printf("\n");}elsefor(i=0;i<n;i++){int ok=1;//判断一个数在数组中是否重复出现的方法 for(j=0;j<=cur;j++){if(A[j]==p[i])//如果重复出现,令标记为0 {ok=0;break;}}if(ok)//如果没有重复出现,执行的操作 {A[cur]=p[i];pailie(n,A,cur+1,p);}else//如果有重复出现的元素,执行的操作 {if(!i||p[i]!=p[i-1]){int c1=0,c2=0;for(j=0;j<cur;j++)//计算A中p[i]出现的次数{if(A[j]==p[i]) c1++;}for(j=0;j<n;j++)//计算p中p[i]重复出现的次数{if(p[j]==p[i]) c2++;}if(c1<c2){A[cur]=p[i];pailie(n,A,cur+1,p);}}}}}int main(){int p[3]={1,1,2} ;int A[4];pailie(3,A,0,p);return 0;}


0 0