A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。
因为某种原因,他们是否参赛受到下列条件的约束:
1. 如果A参加,B也参加;
2. 如果C不参加,D也不参加;
3. A和C中只能有一个人参加;
4. B和D中有且仅有一个人参加;
5. D、E、F、G、H 中至少有2人参加;
6. C和G或者都参加,或者都不参加;
7.
C、E、G、I中至多只能2人参加
8. 如果E参加,那么F和G也都参加。
9. 如果F参加,G、H就不能参加
10. 如果I、J都不参加,H必须参加
请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能
情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。
比如:
C D G J
就是一种可能的情况。
#include
void Test(int comb)
{
int a[10],
i;
for(i = 0; i
< 10; a[i] = (comb >> i++) & 1);
if(!a[0] ||
a[1])
if(a[2] ||
!a[3])
if(!a[0] ||
!a[2])
if(a[1]
&& !a[3] || !a[1] && a[3])
if(!(a[3]
&& !a[4] && !a[5] && !a[6] && !a[7]
||
!a[3]
&& a[4] && !a[5] && !a[6] && !a[7]
||
!a[3]
&& !a[4] && a[5] && !a[6] && !a[7]
||
!a[3]
&& !a[4] && !a[5] && a[6] && !a[7]
||
!a[3]
&& !a[4] && !a[5] && !a[6] && a[7]
||
!a[3]
&& !a[4] && !a[5] && !a[6] &&
!a[7]))
if(a[2]
&& a[6] || !a[2] && !a[6])
if(!(!a[2]
&& a[4] && a[6] && a[8] ||
a[2]
&& !a[4] && a[6] && a[8] ||
a[2]
&& a[4] && !a[6] && a[8] ||
a[2]
&& a[4] && a[6] && !a[8] ||
a[2]
&& a[4] && a[6] && a[8]))
if(!a[4] ||
a[5] && a[6])
if(!a[5] ||
!a[6] && !a[7])
if(a[8] ||
a[9] || a[7])
{
for(i
= 0; i < 10; i++)
if(a[i])
printf("%c ", 'A' + i);
printf("\n");
}
}
int main()
{
int i;
for(i = 1; i
<= 0x3FF; Test(i++));
return
0;
}
结果是
B C G H
C D G H
C D G J
B C G H J
C D G H J