回 帖 发 新 帖 刷新版面

主题:有两个题不会做,快教教我!!!!!!

1、警察抓住了a、b、c、d四个嫌疑犯。a说:我不是小偷。b说:c是小偷。c说:d是小偷。d说:c冤枉人。里面有三句真话,一句假话。请问:谁是小偷?

2、甲、乙、丙、丁、戊分别获百米、二百米、跳高、跳远、铅球冠军。
A:乙获铅球冠军,丁获跳高冠军
B:甲获百米冠军,戊获跳远冠军
C:丙获跳远冠军,丁获二百米冠军
D:乙获跳高冠军,戊获铅球冠军
每人都是一对一错,请问五人各或哪项冠军?

回复列表 (共8个回复)

沙发

1
var
  c:char;
begin
  for c:='a' to 'd' do
    if ord(c<>'a')+ord(c='c')+ord(c='d')+ord(c<>'d')=3 then writeln(c);
end.
第二题我想用枚举

板凳



不会吧,你是不是有那本书?

3 楼


还是再说一下原理(算法)吧,我还是有点不懂

4 楼


终于看懂了,用一个变量c从a到d进行循环,从而判断谁说假话

5 楼


第二个谁来做,我也要来做一下

6 楼


第二题想到一点了,请看:
program sports;
var a,b,c,d,e:integer;
begin
for a:=1 to 5 do
    for b:=1 to 5 do
        for c:=1 to 5 do
            for d:=1 to 5 do
                for e:=1 to 5 do
if (ord(b=5)+ord(d=3)=1) and (ord(a=1)+ord(e=4)=1) and (ord(c=4)+ord(d=2)=1) and (ord(b=3)+ord(e=5)=1) then
writeln ('a--',a,' b--',b,' c--',c,' d--',d,' e--',e);
end.
但我不知道怎样判断a,b,c,d,e是否两两不同,逐个判断太麻烦了,能不能教我个好点的办法?

7 楼

不存在好一点的方法.
话说回来, 计算机速度那么快......

8 楼

[em6]
谁说没有方法?
设一个布尔数组,初值全为true,用过这个数就赋值为false
连这都不知道还学什么编程
var
bo:array[1..5]of boolean;
a,b,c,d,e,j:integer;
begin
fillchar(bo,sizeof(bo),true);
for a:=1 to 5 do
for b:=1 to 5 do
for c:=1 to 5 do
for d:=1 to 5 do
for e:=1 to 5 do
if (ord(b=5)+ord(d=3)=1) and(ord(a=1)+ord(e=4)=1)and(ord(c=4)+ord(d=2)=1)
and(ord(b=3)+ord(e=5)=1) then begin
bo[a]:=false;
bo[b]:=false;
bo[c]:=false;
bo[d]:=false;
bo[e]:=false;
if (bo[1]=false)and(bo[2]=false)and(bo[3]=false)and(bo[4]=false)
and(bo[5]=false) then begin
writeln(a,' ',b,' ',c,' ',d,' ',e);exit;end;
fillchar(bo,sizeof(bo),true);
end;
end.

我来回复

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