主题:警察抓小偷问题
古刹钟声
[专家分:0] 发布于 2010-08-07 08:50:00
新手求救:
警察局抓了a,b,c,d四名偷窃嫌疑犯,其中有一个人是小偷。审问中:
a说:“我不是小偷。”
b说:“c是小偷。”
c说:“小偷肯定是d。”
d说:"c冤枉人。”
现在已经知道四人中三人说的是真话,一人说的假话。问谁是小偷。
最后更新于:2010-08-07 09:19:00
回复列表 (共6个回复)
沙发
北方馒头 [专家分:0] 发布于 2010-08-07 10:17:00
c是小偷,因为如果c不是小偷,那么b d两个说的都是假的,则有两个人说谎了。当然用语言让我写出来,就有点难了,呵呵,我是菜鸟
3 楼
123_fly [专家分:0] 发布于 2010-08-27 14:08:00
网上找到的,不过是c语言编的
问题分析:可通过循环,每次假设一名嫌疑犯为小偷,代入问题系统,检验是否只有一句假话。
为方便设计程序,将a,b,c,d将四个人进行编号,号码分别为1,2,3,4。
算法设计:用变量x存放小偷的编号,则x的取值范围从1取到4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成:
a说的话:x<>1
b说的话:x=3
c说的话:x=4
d说的话:x<>4或not(x=4)
注意:在x的枚举过程中,当这四个逻辑式的值相加等于3时,即表示“四个人中三人说的是真话,一人说的是假话”。
#include "stdafx.h"
void main()
{
int x;
for(x=1;x<=4;x=x+1)
if ((x!=1)+(x==3)+(x==4)+(x!=4)==3)
printf("%c is a thief",char(64+x));
}
4 楼
478860992 [专家分:0] 发布于 2010-09-14 20:46:00
这是逻辑判断题,每个嫌疑人有可能是小偷或者不是,用0和1把它们数字化,0表示不是凶手,1表示是凶手,每个人有2种情况,4个人共有16种组合,枚举每一种组合后根据题目进行判断。
程序如下:
program theif;
var
a,b,c,d,n:integer;
begin
for a:=0 to 1 do
for b:=0 to 1 do
for c:=0 to 1 do
for d:=0 to 1 do
if a+b+c+d=1 then
begin
n:=0;
if a<>1 then inc(n);
if c=1 then inc(i);
if d=1 then inc(n);
if d<>1 then inc(n);
if n=3 then
begin
if a=1 then writeln(a);
if b=1 then writeln(b);
if c=1 then writeln(c);
if d=1 then writeln(d);
end;
end;
end;
运行结果为 c
好好体会一下吧!
5 楼
franklin2000 [专家分:0] 发布于 2011-12-11 13:17:00
你这不够简单这么多行,看着都晕(我也是新手,才学2个月)。看下面的吧:
var xt:char;{char是字符,只有一个字符的}
begin
for xt:='a' to 'd' do
if ord(xt<>'a')+ord(xt='c')+ord(xt='d')+ord(xt<>'d')=3 then{判断,转换为数字0或1,条件成立后判断出哪个是小偷}
writeln(xt);
readln;
end.
我来回复