#include <stdio.h>
#include <stdlib.h>
//從n個元素的數組a中,取m個元素的組合
bool zuhe(char a[],int n,int m)
{//p[x]=y 取到的第x個元素,是a中的第y個元素
int index,i,*p;
p=(int*)malloc(sizeof(int)*m);
if(p==NULL)
{
return false;
}
index=0;
p[index]=0;//取第壹個元素
while(true)
{
if(p[index]>=n)
{//取到底了,回退
if(index==0)
{//各種情況取完了,不能再回退了
break;
}
index--;//回退到前壹個
p[index]++;//替換元素
}
else if(index==m-1)
{//取夠了,輸出
for(i=0;i<m;i++)
{
printf("%c",a[p[i]]);
}
printf("\n");
p[index]++; //替換元素
}
else
{//多取壹個元素
index++;
p[index]=p[index-1]+1;
}
}
free(p);
return true;
}
//對n個元素的數組a,進行全排列
bool pailie(char a[],int n)
{//p[x]=y 取到的第x個元素,是a中的第y個元素
int i,j,temp,*p;
p=(int*)malloc(sizeof(int)*n);
if(p==NULL)
{
return false;
}
for(i=0;i<n;i++)
{//初始排列
p[i]=i;
}
while(true)
{//循環m=n!次
//輸出壹種排列情況
for(i=0;i<n;i++)
{
printf("%c",a[p[i]]);
}
printf("\n");
//從後向前查找,看有沒有後面的數大於前面的數的情況,若有則停在後壹個數的位置。
for(i=n-1;i>0 && p[i]<p[i-1];i--);
//若沒有後面的數大於前面的數的情況,說明已經到了最後壹個排列,返回
if(i==0) break;
//從後查到i,查找大於p[i - 1]的最小的數,記入j
for(j=n-1;j>i && p[j]<p[i-1];j--);
//交換p[i-1]和p[j]
temp=p[i-1];p[i-1]=p[j];p[j]=temp;
//倒置p[i]到p[n-1]
for(i=i,j=n-1;i<j;i++,j--)
{//交換p[c]和p[d]
temp=p[i];p[i]=p[j];p[j]=temp;
}
}
free(p);
return true;
}
int main()
{
char a[]="ABCD";
zuhe(a,4,2);//組合
pailie(a,3);//排列
return 0;
}