使用图形解决以下 whodunnit 问题

问题描述

有 7 名嫌疑人:A、OL、D、B、C、S。他们都参观了犯罪发生的城堡。访问次数最多的人是罪犯。 他们被问到在城堡遇到了谁,他们的回答如下:

A:O、L、B、C。

O:A、L、D、B、S。

L:A、O、D。

D:O、L、B。

B:A、O、D、S。

C:A,S。

S:O、B、C。

我制作了以下图表:

enter image description here

我试着想一想他们参观城堡的可能日子。我说如果X和Y相见,那么他们在同一天参观了城堡。 然后,我们有:

第 1 天:{C,S}

第 2 天:{C,A}

第 3 天:{S,O,B}

第 4 天:{A,B,O}

第 5 天:{O,D}

第 6 天:{L,D,O}

第 7 天:{A,L}

基于此,O 的访问量最多,并且是罪犯。但是,从某些天开始,我可以省略 O,这会改变结果。

我所做的是否正确,或者我的推理是否正确?如果不是,我错在哪里?

解决方法

对于PSO来说,与其说是算法问题,不如说是一个难题。

我相信,嫌疑人的答案是独一无二的:这意味着 A 正好一次遇见了 O。否则它没有任何意义,因为它可以是任何数字。

为了解决这个难题,我创建了一个脚本,该脚本采用一组可疑访问,并为每次访问 XYZ 创建诸如 X: YZY: XZZ: XY 之类的记录(顺序很重要).

使用我发现的脚本,您的访问方案并没有导致嫌疑人的答案。然后我创建了自己的,稍微玩了一下顺序,最后我得到了几乎 100% 的结果(B 答案的顺序略有不同):

A: O,L,B,C
O: A,D,S
L: A,O,D
D: O,B
B: A,S
C: A,S
S: O,C

看起来A 是罪犯,有4 次访问。脚本来源:

visits = %w[
  AO
  AL
  OLD
  BA
  CA
  BD
  OBS
  CS
]
result = {}
visits.each do |visit|
  chars = visit.chars
  chars.each do |char|
    result[char] ||= []
    result[char] += chars - [char]
  end
end
result.each do |k,v|
  puts '%s: %s' % [k,v.join(',')]
end

您可以使用代码 here 进行游戏。 例如,your visits scheme 产生以下嫌疑人的答案:

C: S,A
S: C,B
A: C,L
O: S,A,L
B: S,O
L: D,O