回 帖 发 新 帖 刷新版面

主题:警察抓小偷问题

新手求救:
      警察局抓了a,b,c,d四名偷窃嫌疑犯,其中有一个人是小偷。审问中:
        a说:“我不是小偷。”
        b说:“c是小偷。”
        c说:“小偷肯定是d。”
        d说:"c冤枉人。”
     现在已经知道四人中三人说的是真话,一人说的假话。问谁是小偷。

回复列表 (共6个回复)

沙发

c是小偷,因为如果c不是小偷,那么b d两个说的都是假的,则有两个人说谎了。当然用语言让我写出来,就有点难了,呵呵,我是菜鸟

板凳

还行

3 楼

网上找到的,不过是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 楼

这是逻辑判断题,每个嫌疑人有可能是小偷或者不是,用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 楼

你这不够简单这么多行,看着都晕(我也是新手,才学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.

6 楼


太长了

我来回复

您尚未登录,请登录后再回复。点此登录或注册