【C语言逻辑题】谋杀案凶手是谁?——经典矛盾推理题详解
一、题目背景日本某地发生了一件谋杀案警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词A说不是我。B说是C。C说是D。D说C在胡说。已知3个人说了真话1个人说的是假话请根据这些信息确定谁是凶手。──────────────────────────────────────────────────二、手算推理利用矛盾关系快速锁定凶手1. 核心矛盾点C说凶手是DD说C在胡说即凶手不是D这两人的证词完全矛盾必然一真一假。2. 锁定假话者题目中明确只有1个人说假话因此假话必然在C和D之间剩下的A和B说的一定是真话。3. 推导结论A说不是我为真 → 凶手不是A。B说是C为真 → 凶手就是C。4. 验证结果此时四人的真假情况A真B真C假凶手不是DD真C确实在胡说✅ 完全符合3真1假的条件推理成立。──────────────────────────────────────────────────三、C语言暴力枚举解法适合新手理解思路说明枚举A、B、C、D四人依次假设他们是凶手统计此时真话的数量找到满足3真1假的那个。完整代码#include stdio.hint main(){char killer; // 凶手变量枚举A~D// 依次假设A、B、C、D是凶手for (killer A; killer D; killer){int truth_count 0; // 统计真话数量// 1. A说不是我if (killer ! A)truth_count;// 2. B说是Cif (killer C)truth_count;// 3. C说是Dif (killer D)truth_count;// 4. D说C在胡说即凶手不是Dif (killer ! D)truth_count;// 找到真话数为3的情况输出凶手if (truth_count 3){printf(凶手是%c\n, killer);break;}}return 0;}运行结果凶手是C──────────────────────────────────────────────────四、代码逐行解析代码片段功能说明for (killer A; killer D; killer)循环枚举4个嫌疑犯每次假设一人是凶手if (killer ! A) truth_count;验证A的证词是否为真是则真话数1if (killer C) truth_count;验证B的证词是否为真是则真话数1if (killer D) truth_count;验证C的证词是否为真是则真话数1if (killer ! D) truth_count;验证D的证词是否为真是则真话数1if (truth_count 3)找到满足3真1假的凶手输出结果──────────────────────────────────────────────────五、拓展与总结1. 解题技巧遇到矛盾关系的证词优先用矛盾法缩小范围比暴力枚举效率更高。2. 编程思路把逻辑题转化为代码的核心就是将自然语言的证词转化为可计算的布尔表达式。3. 易错点提醒暴力枚举时要确保覆盖所有可能的凶手避免遗漏或逻辑错误。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2583393.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!