前言:
本文介绍如何去解决逻辑分析题的大致思路。
题目一:
猜凶手
题干:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
思路:
这是一道典型的逻辑分析题,我们可以循环遍历4种情况(分别当A、B、C、D各为凶手时),然后由已知3个人说了假话,1个人说的是真话来判定最后谁是凶手。
代码:
int main() { //假设凶手就是a,遍历循环 for (char a='a';a<='d'; a++) { if ((a != 'a') + (a == 'c') + (a == 'd') + (a != 'd') == 3)//按照题目要求,最后相加为3 printf("凶手就是%c", a); } return 0; }
题目二:
题干:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
思路:
考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性,这个只需要一个5层循环即可搞定。但是这样会导致一些不期望出现的结果出现,所以最后加一个限制条件即可
代码:
//猜名次 int main() { for (int a=1;a<=5;a++) { for (int b=1;b<=5;b++) { for (int c=1;c<=5;c++) { for (int d=1;d<=5;d++) { for (int e=1;e<=5;e++) { if ((b == 2) + (a == 3) == 1 && (b == 2) + (e == 4) == 1 && (c == 1) + (d == 2) == 1 && (c == 5) + (d == 3) == 1 && (e == 4) + (a == 1) == 1) { if (a * b * c * d * e == 120) printf("a=%d b=%d c=%d d=%d e=%d", a, b, c, d, e); } } } } } } return 0; }
灵魂总结:
以后再遇到这类逻辑分析题,我们可以尝试用遍历循环来解决,这种方法最大难点在于如何写出遍历循环的条件。