C++协助破案问题

假设已经查清,有A、B、C、D、E五个嫌疑人可能参与制造了一起抢劫银行案,
但是不知道其中哪几个是真正的案犯。不过,有确凿证据表明:
1.如果A参与了作案,则B一定也会参与;
2.B和C两个人中只有一人参与了作案;
3.C和D要么都参与了作案,要么都没有参与;
4.D和E两个人中至少有一个人参与作案;
5.如果E作案,则A和D一定参与作案。

分析:对于这样的逻辑推理题,我们可以用数理逻辑中的表达式表示上述论断:

1,A->B

2,( B /\ -C) \/ (-B /\ C)

3,(C /\ D) \/ (-C /\ -D)

4,(D /\ E) \/ (-D /\ E) \/ (D /\ -E)

5,E->(A /\ D)

我们现在用 1 表示作案,0 表示未作案,则每个人的取值范围就是{0,1},然后我们在五个人取值所有可能的组合中进行搜索,

同时满足这五条线索的的组合就是本题的答案,于是:

1,A == 0 || ( A == 1 && B == 1 );

2,B + C = 1;

3,C == D ;

4,D + E >= 1;

5,E == 0 || ( E == 1 && A == 1 && D == 1 );

#include <iostream>
using namespace std;
void SolveCase(void)
{
    for (int i = 0; i != 2 ;++i)
        for (int j = 0; j != 2;++j)
            for (int k = 0; k != 2;++k)
                for (int n = 0; n != 2;++n)
                    for (int m = 0; m != 2;++m)
                        if (  
                            ( i == 0 || ( i == 1 && j == 1) )             // Condition1
                            && 
                            ( ( j + k ) == 1 )                            // Condition2
                            && 
                            ( k == n )                                    // Condition3
                            && 
                            ( ( n + m ) >= 1 )                            // Condition4
                            && 
                            ( m == 0 || (m == 1 && i == 1 && n == 1 ) )   // Condition5
                            )
                        {
                            cout<<i<<j<<k<<n<<m<<endl;
                            return ;
                        }
}
int main()
{
    SolveCase();
    return 0;
}

 

 

posted on 2014-03-14 23:23  theCambrian.cpp  阅读(449)  评论(0编辑  收藏  举报

导航