【问题】甲乙丙丁戊五个人在运动会上分获百米、二百米、跳高、跳远和铅球冠军,有
四个人猜测比赛结果:
A说:乙获铅球冠军,丁获跳高冠军。
B说:甲获百米冠军,戊获跳远冠军。
C说:丙获跳远冠军,丁获二百米冠军。
D说:乙获跳高冠军,戊获铅球冠军。
其中每个人都只说对一句,说错一句。求五人各获哪项冠军。
【算法】用1,2,3,4,5分别代表百米、二百米、跳高、跳远和铅球5个项目,用a,b,c,d,e
分别代表五人。如b=3 表示乙获跳高冠军。用多重循环穷举出来。
【答案】甲 乙 丙 丁 戊
1 2 4 3 5
【参考程序】
var
a,b,c,d,e:byte;
begin
for a:=1 to 5 do
for b:=1 to 5 do
if a<>b then
for c:=1 to 5 do
if (a<>c) and (b<>c then
for d:=1 to 5 do
if (a<>d) and (b<>d) and (c<>d) then
begin
e:=15-a-b-c-d;
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;
end.
【问题】5家工厂的产品在一次评比中分获1,2,3,4,5,在公布结果前,已知E
厂产品肯定不是第二、三名,五厂代表猜测评比结果,
A厂的代表说:E厂一定能获得第一名。
B厂的代表说:我厂的产品可能获第二名。
C厂的代表说:A厂的产品质量最次。
D厂的代表说:C厂的产品不是最好的。
E厂的代表说:D厂的产品会获得第一名。
公布结果后,证明只有产品获第一名和第二名的两个厂的代表猜对了。
求5个厂产品各获第几名。 【答案】 A B C D E
5 2 1 3 4
【参考程序】
var a,b,c,d,e:byte;
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 begin
e:=15-a-b-c-d;
if (e<>2) and (e<>3) and (a*b*c*d*e=120) then
if(ord(e=1)+ord(b=2)+ord(a=5)+
ord(c<>1)+ ord(d=1)=2) and
(ord((e=1) and ((a=1) or (a=2)))+
ord((b=2) and ((b=1) or (b=2)))+
ord((a=5) and ((c=1) or (c=2)))+
ord((c<>1) and ((d=1) or (d=2)))+
ord((d=1) and ((e=1) or (e=2)))
=2) then
writeln('a:',a,' b:',b,' c:',c,' d:',d,' e:',e);
end;
end.
【问题】有A、B、C、D四名偷窃嫌疑犯,其中一人是小偷,审问中,A说:“我
不是小偷”,B说:“C是小偷”,C说:“小偷肯定是D”,D说:“C
在冤枉人”,有三人说真话,一人说假话,问到底谁是小偷?
【参考程序】
var thief:char;
begin
for thief:='A' to 'D' do
if ord(thief<>'A')+ord(thief='C')+ord(thief='D')+
ord(thief<>'D')=3 then writeln('The Thief is : ',thief);
end.
4. 四大淡水湖的排序
有4个学生,上地理课时提出我国四大淡水湖的排序如下。
甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三;
乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三;
丙:红泽湖最小,洞庭湖第三;
丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三;
对于各个湖泊应处的地位,每个人只说对了一个。
根据以上情况,编一个程序,让计算机判断各个湖泊应处在第几位。
program exInference4_1;
var
py, dt, th, hz : integer;
begin
writeln(' py dt th hz');
for py := 1 to 4 do
for dt := 1 to 4 do
for th := 1 to 4 do
for hz := 1 to 4 do
begin
if ( ord(dt = 1) + ord(hz = 4) + ord(py = 3) = 1 )
and ( ord(hz = 1) + ord(dt = 4) + ord(py = 2) + ord(th = 3) = 1 )
and ( ord(hz = 4) + ord(dt = 3) = 1 )
and ( ord(py = 1) + ord(th = 4) + ord(hz = 2) + ord(dt = 3) = 1 )
and ( py+dt+th+hz = 10 ) then
writeln(py:3, dt:3, th:3, hz:3);
end;
readln;
end.
上面的程序没有考虑到大小相等的情况。下面的考虑了。
program exInference4_2;
var
py, dt, th, hz : integer;
begin
writeln(' py dt th hz');
for py := 1 to 4 do
for dt := 1 to 4 do
if py <> dt then
for th := 1 to 4 do
if (th <> py) and (th <> dt) then
begin
hz := 10-py-dt-th;
if ( ord(dt = 1) + ord(hz = 4) + ord(py = 3) = 1 )
and ( ord(hz = 1) + ord(dt = 4) + ord(py = 2) + ord(th = 3) = 1 )
and ( ord(hz = 4) + ord(dt = 3) = 1 )
and ( ord(py = 1) + ord(th = 4) + ord(hz = 2) + ord(dt = 3) = 1 ) then
writeln(py:3, dt:3, th:3, hz:3);
end;
readln;
end.