全排列

全排列
•从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("
");
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 }
原文地址:https://www.cnblogs.com/acm-bingzi/p/3151949.html