C语言谁是窃贼问题代码及解析

栏目: C · 发布时间: 7年前

内容简介:警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。这4个人给警察的回答如下。请根据这4个人的回答判断谁是窃贼。

问题描述

警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。

这4个人给警察的回答如下。

  • 甲说:“乙没有偷,是丁偷的。”
  • 乙说:“我没有偷,是丙偷的。”
  • 丙说:“甲没有偷,是乙偷的。”
  • 丁说:“我没有偷。”

请根据这4个人的回答判断谁是窃贼。

问题分析

显然该题是一个逻辑推断问题。已知4个人中的每个人要么是诚实的,要么总是说谎,那么如何来判断他们到底谁是窃贼呢?

由问题描述可知,甲、乙、丙、丁4人中仅有一名窃贼,且这4个人中每个人要么是诚实的,要么总是说谎。分析甲、乙、丙3人所说的话可以发现,他们每人都说了两句话,即:“X没有偷,是Y偷的(其中,X、Y指代甲、乙、丙、丁中的某一个)”,因此,不论这3人是否说谎,他们所提到的这两个人中必有一个是窃贼。而丁只说了他自己没有偷,所以无法判断其真假。

假设用变量A、B、C、D分别代表4个人,变量的值为1代表该人是窃贼,则根据4个人的说法可列出下面的4个条件:

  • 甲说:“乙没有偷,是丁偷的。” —— B+D=1 ①
  • 乙说:“我没有偷,是丙偷的。” —— B+C=1 ②
  • 丙说:“甲没有偷,是乙偷的。” —— A+B=1 ③
  • 丁说:“我没有偷。”            —— A+B+C+D=1  ④

由于甲、乙、丙3人的话中都提到了2个人,其中必有一人是小偷,所以在根据他们的话列出条件表达式时,可以不关心谁说的是真话,谁说的是假话。

由于丁的话无法判断真假,所以根据丁的话列出的表达式只反映了4人中仅有一名是窃贼的条件。

算法设计

该问题的关键是使用 C语言 中的逻辑表达式将问题分析中得到的4个条件表达出来,逻辑表达式如下:

B+D==1 && B+C==1 && A+B==1 ⑤

条件④表示A、B、C、D中必有一个为1。

在程序中可依次假定甲、乙、丙、丁分别为窃贼,带入⑤进行测试,满足条件⑤的那个人为窃贼,具体如下:

  • 先假定甲为窃贼,即A=1,B=0,C=0,D=0,带入条件⑤测试是否成立,若成立则不再对乙、丙、丁进行测试。
  • 若不成立,则再假定乙为窃贼,即A=0,B=1,C=0,D=0,带入条件⑤测试是否成立,若成立则可确定乙为窃贼,不再对丙、丁进行测试。
  • 若不成立,再假定丙为窃贼,即A=0,B=0,C=1,D=0,带入条件⑤测试是否成立,若成立则可确定丙为窃贼,不再对丁进行测试。
  • 若不成立,再假定厂为窃贼,即A=0,B=0,C=0,D=1,带入条件⑤测试是否成立,若成立则确定丁为窃贼。

下面是完整的代码:

#include

int main()

{

int i, A=1, B=0, C=0, D=0;  /*先假定甲是窃贼*/

for(i=1; i<=4; i++)

if(B+D==1 && B+C==1 && A+B==1)  /*测试甲乙丙丁谁是窃贼,符合该条件的即为窃贼*/

break;

else

{

if(i == 1)

{

A=0;  /*甲不是窃贼,测试乙是否是窃贼*/

B=1;

}

if(i == 2)

{

B=0;  /*甲乙均不是窃贼,测试丙是否是窃贼*/

C=1;

}

if(i == 3)

{

C=0;  /*甲乙丙都不是窃贼,测试丁是否是窃贼*/

D=1;

}

}

/*输出结果*/

printf("判断结果:\n");

if(i == 1)

printf("甲是窃贼\n");

if(i == 2)

printf("乙是窃贼\n");

if(i == 3)

printf("丙是窃贼\n");

if(i == 4)

printf("丁是窃贼\n");

return 0;

}

运行结果:

判断结果:

乙是窃贼

C语言谁是窃贼问题代码及解析

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-01/156479.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical JavaScript, DOM Scripting and Ajax Projects

Practical JavaScript, DOM Scripting and Ajax Projects

Frank Zammetti / Apress / April 16, 2007 / $44.99

http://www.amazon.com/exec/obidos/tg/detail/-/1590598164/ Book Description Practical JavaScript, DOM, and Ajax Projects is ideal for web developers already experienced in JavaScript who want to ......一起来看看 《Practical JavaScript, DOM Scripting and Ajax Projects》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具