日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个题目详解(逻辑类型题2)

简介: 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个题目详解(逻辑类型题2)

题目内容

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

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

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

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

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

题目分析

这是一道经典的逻辑推理问题,如果我们从数学的角度来分析,就是要寻找矛盾点相同点进而做出假设分析,在假设的前提下来推理。

例如 C和D两个选手有一处矛盾点就是:D是否是凶手,我们可以从这个点进行突破,假设D是凶手这个是对的,那我们就根据A和B的话来判断;假设D是凶手这个是错的,同理推测

如果我们从编程的角度来分析,我们就要先知道总共的可能性,把每一种可能考虑到。

思路一

这个的思路就是和我之前写的那个逻辑类型题1中的跳水运动员预测比赛结果排名次问题一样。每个abcd四个人要么为0,要么为1,通过四个循环得到所有的结果,

然后我们通过这四个人说的话将其翻译为代码,然后有一个人说谎那么他说的话得到的就是0;

其他人说的是真话得到的答案为1,那么四个表达式相加就为3

但是千万不能忘了凶手只有一个那么四个值相加就只能为1最后再通过f语句判断哪一个是1由此就能得到谁是凶手了。

思路二

每次假设一个人说了谎,4次循环

然后cd说话矛盾

fd为1则表示矛盾任然存在

为0则表示矛盾消失,

那么当在这四次循环中有谁满足了只有一个凶手且fd为0则就抓住了凶手。

代码展示

思路一

#include<stdio.h>
int main()
{
  int a = 0, b = 0, c = 0, d = 0;
  for (a = 0; a <= 1; a++)
  {
    for (b = 0; b <= 1; b++)
    {
      for (c = 0; c <= 1; c++)
      {
        for (d = 0; d <= 1; d++)
        {//上面的代码
          if ((a != 1) + (c == 1) + (d == 1) + (d != 1)==3)
          {
            if (a + b + c + d == 1)
            {
              if (a == 1)
                printf("a为凶手");
              else if (b == 1)
                printf("b为凶手");
              else if (c == 1)
                printf("c为凶手");
              else
                printf("d是凶手");
            }
          }
        }
      }
    }
    return 0;
  }
}

思路二

#include<stdio.h>
int main()
{
  int a=0, b=0, c=0, d=0, fd=0;
  int i = 0;
  for (i = 0; i < 4; i++)
  {
    if (i == 0)//假设a说的就是假话
    {
      a = 1; c = 1; d = 0; fd = 1;
    }
    if (i == 1)//假设b说的是假话
    {
      a = 0; c = 0; d = 0; fd = 1;
    }
    if (i == 2)//假设c说的是假话
    {
      a = 0; c = 1; d = 0; fd = 0;
    }
    if (i == 3)//假设d说的是假话
    {
      a = 0; c = 1; d = 1; fd = 0;
    }
    if ((a + b + c + d + fd == 1) && (fd == 0))//锁定唯一的凶手
    {
      printf("A是%d,B是%d,c是%d,d是%d\n", a, b, c, d);//这里结果为1的那个人就是凶手
    }
  }
  return 0;
}

结果展示

 

相关文章
|
4月前
|
存储 缓存 安全
几道 C/C 题涉及的知识盲区
几道 C/C 题涉及的知识盲区
|
Go
腥风血雨中,这招救了我的代码!
腥风血雨中,这招救了我的代码!
73 0
|
Web App开发 前端开发 JavaScript
冬奥快结束了还没有抢到冰墩墩?程序员一招让你不用排队不用愁!
随着“2022北京冬奥会”的盛大开幕,冰墩墩的热度与日俱增,线上被抢空,线下排长龙,为购买冰墩墩苦恼的竟少了几根秀发!如今冬奥马上就要拉下帷幕,还没抢到“冰墩墩”不要紧,这款程序来帮忙,国内一位程序员dragonir用前端+建模的方式自己就实现了线上拥有“冰墩墩”,同时将代码开源到了GitHub上,不得不感叹科技的力量,程序员的伟大,让拥有“冰墩墩”变得如此简单!
冬奥快结束了还没有抢到冰墩墩?程序员一招让你不用排队不用愁!
|
消息中间件 Kubernetes Cloud Native
记一次内部分享——瞎扯淡
记一次内部分享——瞎扯淡
记一次内部分享——瞎扯淡
|
算法 NoSQL 安全
血的教训 ,一次订单号重复的事故我差点被开除
曾经有个项目,我们线上出了一次事故,这个事故的表象大体是这样的: 系统出现了两个一模一样的订单号,订单的内容却不是一样的,而且事情发生的不止一次,被老板发现之后,当月绩效被扣光!
血的教训 ,一次订单号重复的事故我差点被开除
|
存储 监控 安全
杂货机器人翻车实录:会被路人“吓”到,还会跟错主人!3千美元怕是买了个寂寞?
杂货机器人翻车实录:会被路人“吓”到,还会跟错主人!3千美元怕是买了个寂寞?
223 0
|
前端开发 Java 索引
【程序媛晒83行代码】被代码耽误的吃货小姐姐,用代码终结选择困难症
采霜的83行代码来自,工作一忙有时候饭也顾不上吃,于是就顺手写一段终结选择困难症的代码,大家随意看看~
3796 0
读《股票大作手操盘术》— 利弗莫尔操作法则
《股票大作手操盘术》读书笔记; 股票大作手操盘术是利弗莫尔本人写的一本著作,利弗莫尔在股民中的知名度自然不必多言,其著作中的思想放在当代也很有意义,所以最近拜读了一下。
1918 0
她,渐行渐远,你,依旧在远方!
     好久没写文章,可能写的文章干涩涩。自从看了她写的文章,沁入眼帘,一句句押韵,优美的文字吸引了我.让我成为她的一个熟悉的新粉丝。      她,才华横溢,散发着阵阵诗人气息,她曾说,她要成为一个诗人,成为一个作者,把自己的生活经历让世人所知.
1279 0