我正在尝试编写一个解决像mastermind这样的游戏的程序,而且我有点卡住了。我不想要一个完整的解决方案,只需要帮助我无法通过的部分。这是游戏:
提前知道N
种可能的颜色。有k
的未知集合(可能有重复)被选中并保密。目标是猜测秘密集中的颜色(重复)。让我再次强调这是一个集合,所以顺序无关紧要,但允许重复。例如
颜色为
a,b,c,d,e,f,g,h
(N=8
),未知集为{a,c,c}
(k=3
)。
进行连续猜测,得出有关秘密集的更多信息。每个猜测必须是k
颜色的一组(允许重复)。对每个猜测的响应是猜测和未知计数重复之间共同的颜色数。例如
猜猜:
a,d,e
结果:1
猜猜:
b,c,f
结果:1
猜猜:
a,a,g
结果:1
猜猜:
a,c,h
结果:2
- 醇>
猜猜:
b,e,h
结果:0
在游戏开始时,没有颜色肯定在集合中或绝对不在未知集合中(假设N>1
)。在产生0
的猜测之后,已知该猜测的所有颜色都不在未知集合中。如果结果为k
,那么已知该猜测的所有颜色都在未知集合中。我在编写程序时难以找出其中的所有案例。例如,在上一次猜测之前,对于任何颜色都不知道任何颜色。在最后一次猜测之后,该集合已知为a,c,c
。逻辑是:
b,e,h
不在未知集合中a,c
在未知集合中d
不在未知集合中f
不在未知集合中g
不在未知集合中a
和c
。a
不会多次出现在未知集合中。a,c,c
。我可以通过这种方式处理逻辑,但我不确定如何对此进行编程。如果有人可以建议采用有条理的方式来实现它,那就太好了。 我更倾向于使用伪代码进行高级解释,而不是任何一种语言的完整实现。 谢谢。
答案 0 :(得分:1)
直接的方法:建立可能组合的总人口。然后,随着猜测的进入,删除无法满足当前猜测结果的组合。一旦你只剩下一个组合,这就是解决方案。或者,在此过程的早期,当您不再使用特定颜色时,那个(显然)从可能的密码中删除了。
答案 1 :(得分:1)
您可以在每次猜测后对逻辑进行编码,如下所示。取一个长度为N
的数组,如果i
颜色在集合中,则+1
的输入为i
,-1
如果i
1}}颜色不在集合中0
如果不知道i
颜色是否在集合中。
每次猜测后,您都会创建满足结果的可能数组。如果猜测结果为r
,那么可能的数组会有(k choose r)
(如果有重复的颜色则会更少)。对于您的示例,数组(为了简洁起见,我使用的是+
而不是+1
和-
而不是-1
)
(+,0,0,-,-,0,0,0) | (-,0,0,+,-,0,0,0) | (-,0,0,-,+,0,0,0)
(0,+,-,0,0,-,0,0) | (0,-,+,0,0,-,0,0) | (0,-,-,0,0,+,0,0)
(+,0,0,0,0,0,-,0) | (-,0,0,0,0,0,+,0)
(+,0,+,0,0,0,0,-) | (+,0,-,0,0,0,0,+) | (-,0,+,0,0,0,0,+)
(0,-,0,0,-,0,0,-)
现在,您可以在信息进入时检查各种可能性之间的一致性。第一次猜测后有3种可能性,每种可能性同等有效。在第二次猜测之后,有9种可能性(前3个中的1个和第3个中的1个)并且每个可能性都有效。在第三次猜测之后,有18种可能性,其中只有9种是有效的。这是因为3中的左选项需要从1开始的左选项,反之亦然。在第四次猜测之后,有5种有效的可能性。在第五次猜测之后,只有一种有效的可能性,即:
(+,0,0,-,-,0,0,0)
(0,-,+,0,0,-,0,0)
(+,0,0,0,0,0,-,0)
(+,0,+,0,0,0,0,-)
(0,-,0,0,-,0,0,-)
现在已知包含/排除每种颜色。您可以以类似的方式处理多重性。
答案 2 :(得分:0)
Knuth described解决方案。我implemented。
答案 3 :(得分:0)
所选项目:ade = 1 => 3种可能100,010,001
此行未知:bcfgh =? => 5项= 32种可能
将这些结合起来给出32 * 3 = 96个可能的答案
重复下一行并删除所有行不可能的行
直到只剩下一个