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