主题:[讨论]对与逻辑判断的问题。
interegg
[专家分:80] 发布于 2006-08-24 09:25:00
三人对比赛名次进行预测:
甲说:A得第一,B得第三;
乙说:C得第一,D得第四;
丙说:D得第一,B得第三;
每人都说对了一半,请你排出四人的名次。
小弟不才,没做过这一类题目,哪位帮我引导一下,谢谢。
回复列表 (共4个回复)
沙发
jtchang [专家分:5370] 发布于 2006-08-24 11:25:00
名次是: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.
板凳
interegg [专家分:80] 发布于 2006-08-24 14:23:00
请问这是不是解这类题目的最好方法?
谢谢。[em2]
3 楼
interegg [专家分:80] 发布于 2006-08-24 14:33:00
小弟不才,问一下:
for j := 1 to n-1 do
if s[j] = i then b := true;
是否是判断与前面的数是否相同?
谢谢。
[em2]
4 楼
贺天行宝 [专家分:2300] 发布于 2006-08-24 15:20:00
是判断s数组的下标1到n-1个元素有没有数与i等值,如果有b为true
我来回复