全排列
全排列
•从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n各不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
•设一组数R={r1,r2,r3,...,rn},全排列为perm(R)。
n=1时,Perm(R)=r,其中r是集合中唯一元素
n>1时,Perm(R)由r1Perm(R1), r2Perm(R2), r3Perm(R3),…, rnPerm(Rn)构成。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
1 # include<stdio.h> 2 void Swap(int& x,int& y) 3 { 4 int temp=x; 5 x=y; 6 y=temp; 7 } 8 void Perm(int list[],int k,int m) //k表示前缀的位置,m是要排列的数目. 9 { 10 if(k==m-1) //前缀是最后一个位置,此时打印排列数. 11 { 12 for(int i = 0; i < m; i++) 13 { 14 printf("%d ",list[i]); 15 } 16 printf("\n"); 17 } 18 else 19 { 20 for(int i = k; i < m; i++) //交换前缀,使之产生下一个前缀. 21 { 22 Swap(list[k],list[i]); 23 Perm(list,k+1,m); 24 //将前缀换回来,继续做上一个的前缀排列. 25 Swap(list[k],list[i]); 26 } 27 } 28 } 29 30 int main() 31 { 32 int list[20]; 33 int i,m,n,j; 34 while(scanf("%d%d",&n,&m)!=EOF) 35 { 36 for(i=0; i<n; i++) 37 scanf("%d",&list[i]); 38 Perm(list,0,m); 39 for(i=0; i<m; i++) 40 for(j=m; j<n; j++) 41 { 42 Swap(list[i],list[j]); 43 Perm(list,0,m); 44 Swap(list[i],list[j]); 45 } 46 } 47 return 0; 48 }
把每一件简单的事情做好,就是不简单;把每一件平凡的事情做好,就是不平凡!相信自己,创造奇迹~~