逻辑推断题

来源:互联网 发布:敢爱敢恨的女人 知乎 编辑:程序博客网 时间:2024/05/01 02:48
/**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 I*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 15;//a b c d e f g h i j//0 1 2 3 4 5 6 7 8 9int Judge(int* a ){    int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;    t0 = a[0] == 0 || a[1] == 1;//a -> b <==> ~a || b    t1 = a[2] == 1 || a[3] == 0;    t2 = a[0] + a[2] <= 1;    t3 = a[1] + a[3] == 1;    t4 = a[3] + a[4] + a[5] + a[6] + a[7] >= 2;    t5 = (a[2] + a[6] == 2) || (a[2] + a[6] == 0);    t6 = a[2] + a[4] + a[6] + a[8] <= 2;    t7 = a[4] == 0 || (a[5] + a[6] == 2);    t8 = a[5] == 0 || (a[6] + a[7] == 0);    t9 = (a[8] + a[9] == 1) || a[7] == 1;    return t0 && t1 && t2 && t3 && t4 && t5 && t6 && t7 && t8 &&t9;}void Print(int a[]){    for(int i = 0; i < 10; ++i)        if(a[i])            printf("%c ", i + 'A');    cout<<endl;}void Find_Ans(int* a, int n){    if(n >= 10)    {        if(Judge(a))            Print(a);        return;    }    a[n] = 0;    Find_Ans(a, n+1);    a[n] = 1;    Find_Ans(a, n+1);}int main(){    int aa[MAXN];    memset(aa, 0, sizeof(aa));    Find_Ans(aa, 0);    return 0;}

0 0