[原]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)+" 组");