受约束的10人参赛问题

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

posted @ 2012-12-27 16:15  刘竹青  阅读(105)  评论(0编辑  收藏  举报