• C语言解决逻辑分析题(猜凶手)(猜名次)


    前言:

    本文介绍如何去解决逻辑分析题的大致思路。

    题目一:

    猜凶手

    题干:

    日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

    以下为4个嫌疑犯的供词:

    A说:不是我。

    B说:是C。

    C说:是D。

    D说:C在胡说

    已知3个人说了真话,1个人说的是假话。

    现在请根据这些信息,写一个程序来确定到底谁是凶手。

    思路:

    这是一道典型的逻辑分析题,我们可以循环遍历4种情况(分别当A、B、C、D各为凶手时),然后由已知3个人说了假话,1个人说的是真话来判定最后谁是凶手。

    代码:

    1. int main()
    2. {
    3. //假设凶手就是a,遍历循环
    4. for (char a='a';a<='d'; a++)
    5. {
    6. if ((a != 'a') + (a == 'c') + (a == 'd') + (a != 'd') == 3)//按照题目要求,最后相加为3
    7. printf("凶手就是%c", a);
    8. }
    9. return 0;
    10. }

    题目二:

    题干:

    5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

    A选手说:B第二,我第三;

    B选手说:我第二,E第四;

    C选手说:我第一,D第二;

    D选手说:C最后,我第三;

    E选手说:我第四,A第一;

    比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

    思路:

    考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性,这个只需要一个5层循环即可搞定。但是这样会导致一些不期望出现的结果出现,所以最后加一个限制条件即可

    代码:

    1. //猜名次
    2. int main()
    3. {
    4. for (int a=1;a<=5;a++)
    5. {
    6. for (int b=1;b<=5;b++)
    7. {
    8. for (int c=1;c<=5;c++)
    9. {
    10. for (int d=1;d<=5;d++)
    11. {
    12. for (int e=1;e<=5;e++)
    13. {
    14. if ((b == 2) + (a == 3) == 1 &&
    15. (b == 2) + (e == 4) == 1 &&
    16. (c == 1) + (d == 2) == 1 &&
    17. (c == 5) + (d == 3) == 1 &&
    18. (e == 4) + (a == 1) == 1)
    19. {
    20. if (a * b * c * d * e == 120)
    21. printf("a=%d b=%d c=%d d=%d e=%d", a, b, c, d, e);
    22. }
    23. }
    24. }
    25. }
    26. }
    27. }
    28. return 0;
    29. }

    灵魂总结:

    以后再遇到这类逻辑分析题,我们可以尝试用遍历循环来解决,这种方法最大难点在于如何写出遍历循环的条件。

  • 相关阅读:
    Android Root全教程
    Linux目录操作
    matlab自定义添加设置工具箱
    Windows 下 VS 配置 OpenGL 环境
    P01914005张怡安(信息论作业)
    自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
    盘点企业微信内部群和外部群的区别
    使用token登录提交到github
    san.js源码解读之工具(util)篇——extend函数
    GDL学习笔记(二)——图基础知识:中心性
  • 原文地址:https://blog.csdn.net/hanwangyyds/article/details/134233022