主题:有两个题不会做,快教教我!!!!!!
tbk
[专家分:30] 发布于 2006-04-17 13:26:00
1、警察抓住了a、b、c、d四个嫌疑犯。a说:我不是小偷。b说:c是小偷。c说:d是小偷。d说:c冤枉人。里面有三句真话,一句假话。请问:谁是小偷?
2、甲、乙、丙、丁、戊分别获百米、二百米、跳高、跳远、铅球冠军。
A:乙获铅球冠军,丁获跳高冠军
B:甲获百米冠军,戊获跳远冠军
C:丙获跳远冠军,丁获二百米冠军
D:乙获跳高冠军,戊获铅球冠军
每人都是一对一错,请问五人各或哪项冠军?
回复列表 (共8个回复)
沙发
贺天行宝 [专家分:2300] 发布于 2006-04-17 19:21:00
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.
第二题我想用枚举
板凳
tbk [专家分:30] 发布于 2006-04-17 20:10:00
不会吧,你是不是有那本书?
3 楼
tbk [专家分:30] 发布于 2006-04-17 20:15:00
还是再说一下原理(算法)吧,我还是有点不懂
4 楼
tbk [专家分:30] 发布于 2006-04-17 20:18:00
终于看懂了,用一个变量c从a到d进行循环,从而判断谁说假话
5 楼
tbk [专家分:30] 发布于 2006-04-17 20:22:00
第二个谁来做,我也要来做一下
6 楼
tbk [专家分:30] 发布于 2006-04-21 13:06:00
第二题想到一点了,请看:
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 楼
maxumi [专家分:2200] 发布于 2006-04-21 13:43:00
不存在好一点的方法.
话说回来, 计算机速度那么快......
8 楼
adsfasdf [专家分:0] 发布于 2007-08-20 12:46:00
[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.
我来回复