博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

逻辑判断问题

Posted on 2010-10-07 11:15  桃子在路上  阅读(400)  评论(0编辑  收藏  举报

【问题】甲乙丙丁戊五个人在运动会上分获百米、二百米、跳高、跳远和铅球冠军,有

        四个人猜测比赛结果:

          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.