zoukankan      html  css  js  c++  java
  • 全排列

    全排列
    •从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 }
  • 相关阅读:
    android videoView 加载等待
    LocalBroadcastManager
    sessionStorage 、localStorage
    javascript 数组、json连接
    properties 文件注意事项
    nutz 使用beetl
    [Git/Github] ubuntu 14.0 下github 配置
    【UNIX环境编程、操作系统】孤儿进程和僵尸进程
    【操作系统】进程间通信
    【操作系统】线程
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3151949.html
Copyright © 2011-2022 走看看