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 阅读(454) 评论(0) 编辑 收藏 举报