[原]BCB 排列组合

//--------组合C(m,n)--------------------------------------------------------------
typedef
class Combination
{
    private:
        int       m,n;
    public:
        int       *Array;                   //   存放数
        Combination(int   m0,int   n0);
        ~Combination();
        void     GetFirst();           //   初始化
        bool     GetNext();             //   取下一组
}Combination; 

Combination::Combination(int   m0,int   n0)
{
    m=m0;n=n0;
    Array=new   int[m+1];
    GetFirst();
}

Combination::~Combination()
{
            delete[]   Array;  
}

void Combination::GetFirst()     //   无重复
{
            for   (int   i=1;i<=m;i++)  
                    Array[i]=i;             //   首组下标,M个数  
}

bool Combination::GetNext()
{       //   求下一组,若有返true,否则为假
    for(int i=m;i>=1;i--)
    {
      int b=Array[i];
      if(b<n-m+i)         //x[i]是否到了极限n-m+i
      {
        for(int j=i;j<=m;j++)
        {
          b+=1;
          Array[j]=b;
        }
        return(true);
      }
    }
    return(false);     //   元素全到了极限,该结束了
}
   
//----------排列P(m,n)---------------------------------------------------------
typedef
class Permutation
{
    private:
      int  m,n;
      bool *set;                           //   集合1..n
      int Greater(int   x);   //   取集合中更大的元素
    public:
      int *Array;                   //   存放数
      Permutation(int   m0,int   n0);
      ~Permutation();
      void GetFirst();           //   初始化
      bool GetNext();             //   取的下一组
}Permutation;

Permutation::Permutation(int   m0,int   n0)
{
    m=m0;n=n0;
    Array=new   int[m+1];
    set=new   bool[n+1];
    GetFirst();
}

Permutation::~Permutation()
{
    delete[]   Array;
    delete[]   set;
}
void Permutation::GetFirst()
{
    for(int i=1;i<=m;i++)
    {
      Array[i]=i;             //   首组下标,M个数
      set[i]=false;
    }
    for(int i=m+1;i<=n;i++)
      set[i]=true;
}

int Permutation::Greater(int x)
{         //   取集合中比x大的一个数,没有返0
    for(int i=x+1;i<=n;i++)
      if(set[i])
      {
        set[i]=false;
        return(i);
      }
    return(0);
}

bool Permutation::GetNext()
{       //   求下一组,若有返true,否则为假
    for(int i=m;i>=1;i--)
    {
      int b=Array[i];
      int b1=Greater(b);
      set[b]=true;     //   放回集合中
      if(b1!=0)
      {
        Array[i]=b1;
        b=0;
        for(int j=i+1;j<=m;j++)
        {
          b=Greater(b);
          Array[j]=b;
        }
        return(true);
      }
    }
    return(false);     //   元素全到了极限,该结束了
}

MemoShow->Lines->Clear();
    char   *d[100];           //   存放待排列的串
    int     m=4,n=6;           //   从N数中取M个排列数
    int     js=0;                 //   组计数
    m=EditNumber->Text.ToInt();
    n=EditNumber2->Text.ToInt();
    for(int i=0;i<n;i++)
    {
        //d[i]=IntToStr(i);
    }
    //d[1]="1";     d[2]="2";
    //d[3]="3";     //d[4]="4";
    //d[5]="5";     d[6]="6";

        //Combination p(m,n);         //C(4,6)=15组

        Permutation p(m,n);         //P(4,6)=360组


            //       Repetition     p(m,n);         //R(4,6)=1296组
    do
    {
        String   s="";
        for   (int   i=1;i<=m;i++)
        s=s+String(d[p.Array[i]])+"   ";
        MemoShow->Lines->Add(s);     //   显示
        js=js+1;
    }
    while   (p.GetNext());       //找下一组排列
        MemoShow->Lines->Add("共   "+String(js)+"   组");

 

posted @ 2009-09-11 08:44  小さいです哥  阅读(195)  评论(0)    收藏  举报