回 帖 发 新 帖 刷新版面

主题:[讨论]对与逻辑判断的问题。

三人对比赛名次进行预测:
甲说:A得第一,B得第三;
乙说:C得第一,D得第四;
丙说:D得第一,B得第三;
每人都说对了一半,请你排出四人的名次。

小弟不才,没做过这一类题目,哪位帮我引导一下,谢谢。

回复列表 (共4个回复)

沙发

名次是:A4 B3 C1 D2 

首先你把四个人的名次做一次全排列,列出所有情况,再跟甲、乙、丙三人的话校验,看看这种排列是否符合条件。

“每人都说对了一半”,用xor运算(叫“异或”,或者叫“不可兼或”)最好了,若说的一句话是T1,另一句话是T2, 当 T1 xor T2 为真时,定有一句话是真的,另一句话是假的。

===程序说明:===

s[1]、s[2]、s[3]、s[4]分别表示A、B、C、D所得到的名次。
procedure p 用来实现全排列,
function check 用来校验对于每一种排列,是否符合三个人说的话(各对一半)。


===源程序===


var  s: array[1..4] of integer;

function check: boolean;
begin
    check := ( (s[1]=1) xor (s[2]=3) ) and
             ( (s[3]=1) xor (s[4]=4) ) and
             ( (s[4]=1) xor (s[2]=3) );
end;

procedure p(n:integer);
var
    i,j,k: integer;
    b  : boolean;
begin
   if n=5 then
     begin
         if check then
           begin
              for k := 1 to 4 do write(s[k]:4);
              writeln;
           end;
         exit;
     end;
    for i := 1 to 4 do
      begin
        b := false;
        for j := 1 to n-1 do
           if s[j] = i then b := true;
        if not b then
           begin
               s[n] := i;
               p(n+1);
           end;
      end;
end;

BEGIN
    p(1);
END.





板凳

请问这是不是解这类题目的最好方法?
谢谢。[em2]

3 楼

小弟不才,问一下:
for j := 1 to n-1 do
           if s[j] = i then b := true;
是否是判断与前面的数是否相同?
谢谢。

[em2]

4 楼

是判断s数组的下标1到n-1个元素有没有数与i等值,如果有b为true

我来回复

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