69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m, int n)
{
int i,j,a,b,c,ch;
for (i = m; i >= n; i--) {
comb[n] = i; /* 选择当前的“头”元素 */
if (n > 1){
/* 进入下一次更小的组合问题 */
combination(i - 1, n - 1);
}else{
/* 需要的组合数 */
/*每组中必须包含A,而每组中B和C必须有且仅有其中的一个*/
a=0;
b=0;
c=0;
for (j = comb[0]; j > 0; j--) {
ch=65+c1-comb[j];
if (ch=='A') a=1;
if (ch=='B') b=1;
if (ch=='C') c=1;
}
if ((a==1 && b==1 && c==0)
||(a==1 && b==0 && c==1)) {
/*输出*/
for (j = comb[0]; j > 0; j--) {
printf("%c", 65+c1-comb[j]);
}
printf("\n");
}
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}
//C:\mydir>zhfilter 11 5
//ABDEF
//ABDEG
//ABDEH
//ABDEI
//ABDEJ
//ABDEK
//ABDFG
//ABDFH
//ABDFI
//ABDFJ
//ABDFK
//ABDGH
//ABDGI
//ABDGJ
//ABDGK
//ABDHI
//ABDHJ
//ABDHK
//ABDIJ
//ABDIK
//ABDJK
//ABEFG
//ABEFH
//ABEFI
//ABEFJ
//ABEFK
//ABEGH
//ABEGI
//ABEGJ
//ABEGK
//ABEHI
//ABEHJ
//ABEHK
//ABEIJ
//ABEIK
//ABEJK
//ABFGH
//ABFGI
//ABFGJ
//ABFGK
//ABFHI
//ABFHJ
//ABFHK
//ABFIJ
//ABFIK
//ABFJK
//ABGHI
//ABGHJ
//ABGHK
//ABGIJ
//ABGIK
//ABGJK
//ABHIJ
//ABHIK
//ABHJK
//ABIJK
//ACDEF
//ACDEG
//ACDEH
//ACDEI
//ACDEJ
//ACDEK
//ACDFG
//ACDFH
//ACDFI
//ACDFJ
//ACDFK
//ACDGH
//ACDGI
//ACDGJ
//ACDGK
//ACDHI
//ACDHJ
//ACDHK
//ACDIJ
//ACDIK
//ACDJK
//ACEFG
//ACEFH
//ACEFI
//ACEFJ
//ACEFK
//ACEGH
//ACEGI
//ACEGJ
//ACEGK
//ACEHI
//ACEHJ
//ACEHK
//ACEIJ
//ACEIK
//ACEJK
//ACFGH
//ACFGI
//ACFGJ
//ACFGK
//ACFHI
//ACFHJ
//ACFHK
//ACFIJ
//ACFIK
//ACFJK
//ACGHI
//ACGHJ
//ACGHK
//ACGIJ
//ACGIK
//ACGJK
//ACHIJ
//ACHIK
//ACHJK
//ACIJK