33,027
社区成员




//下面函数从一个结合的全排列中取出第n个
void GetN(int N, char set1[], int n, char out1[])
{
char * pset2=new char[N]; //拷贝原来的集合
int pos;
int j,k;
for(pos=0; pos < N; pos++)
{
pset2[pos]=set1[pos];
}
for(pos =0; pos < N ; pos ++)
{
//选取一个元素
k = n % (N-pos);
out1[pos]= pset2[k];
//把选出的元素删除
for(j=k; j<N-1; j++)
{
pset2[j]= pset2[j+1];
}
n= n/(N-pos);
}
delete []pset2;
}
void GetN(
int N, //每个集合中元素个数
char set1[], char set2[], //两个集合
int n, //第n中排列情况
char set1o[], char set2o[]//输出的结果
)
{
int N1 =1;
int k;
for(k=2; k< N ; k++) N1 *= k;
GetN(N, set1, n%N1,set1o);
GetN(N, set2, n/N1,set2o);
}
#include <stdio.h>
int C=0;
char a[]={'1','2','3','4','5','6','7','8'};
void Permutation(char a[], int start, int end)
{
int i, temp;
static char b[]={'A','B','C','D','E','F','G','H'};
if(start == end)
{
++C;
if( C<2 )
Permutation( b, 0, sizeof(b)/sizeof(b[0])-1 );
else{
for(i = 0; i <= end; i++)
printf(" %c%c ",::a[i],b[i]);
printf("\n");
}
}
else
{
for(i = start; i <= end; i++)
{
temp=a[start]; a[start]=a[i]; a[i]=temp;
Permutation(a, start+1, end);
temp=a[start]; a[start]=a[i]; a[i]=temp;
}
}
}
int main()
{
Permutation( a, 0, sizeof(a)/sizeof(a[0])-1 );
return 0;
}