zoukankan      html  css  js  c++  java
  • 2013_11_14:递归算法(2)—全排列

    3.经典例题

       设R = {r1,r2,r3......rn}是要进行排列的n个元素,Ri = R-{ri}。集合X中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下:

       当n = 1时,Perm(R) = (r),其中r是结婚R中唯一的元素。

       当n > 1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2)......(rn)Perm(Rn)构成。其实这就是一个递归过程,拿(r1)Perm(R1)来说,全排列Perm(R1) = Perm( {r2,r3,r4.....rn})之后再在所有排列之前加上r1就可以了,其中{r2,r3,r4.....rn}又是一个新的集合,可以由(r2)Perm({r3,r4....rn}),(r3)Perm({r2,r4....rn})......表示,一直递归下去,直到最后Perm({rx})也就是只剩下一个元素时全排列也就是自己了rx,然后再逐步返回加上前面的前缀,这就是(r1)Perm(R1)。

      template <class Type>

     void Perm(Type list[] int prefix,int length)

    {

           if(prefix == length)//it means there is an element

           {

                   for(int i=0;i<=length;++i)

                          cout<<list[i]<<endl;//print the value of list

            }else{

                  for(int j = prefix;j<=length;++j)

                 {

                        exchange(list[prefix],list[j]);//exchange the value of list[prefix] and list[j]

                        Perm(list,perfix+1,length);

                        exchange(list[prefix],list[j]);

                  }

             }

    }

  • 相关阅读:
    Linq与Lambda,神一般的工作效率
    svn和git孰优孰劣
    关于C++的***5的输出问题
    POJ 3469 Dual Core CPU(最小割)
    HDU 4259 Double Dealing
    最大流Dinic算法
    HDU 4442 Physical Examination(2012年金华赛区现场赛A题)
    int ,long , long long类型的范围
    POJ 1679 The Unique MST(判断最小生成树是否唯一)
    HDU 4280 Island Transport(网络流)
  • 原文地址:https://www.cnblogs.com/xiaoaiyi/p/3424540.html
Copyright © 2011-2022 走看看