如何使用逻辑推理分析类似策划者的游戏

时间:2012-01-30 17:46:06

标签: algorithm set logic


免责声明:我不是在寻找Mastermind的解决方案。


我正在尝试编写一个解决像mastermind这样的游戏的程序,而且我有点卡住了。我不想要一个完整的解决方案,只需要帮助我无法通过的部分。这是游戏:

提前知道N种可能的颜色。有k的未知集合(可能有重复)被选中并保密。目标是猜测秘密集中的颜色(重复)。让我再次强调这是一个集合,所以顺序无关紧要,但允许重复。例如

  

颜色为a,b,c,d,e,f,g,hN=8),未知集为{a,c,c}k=3)。

进行连续猜测,得出有关秘密集的更多信息。每个猜测必须是k颜色的一组(允许重复)。对每个猜测的响应是猜测和未知计数重复之间共同的颜色数。例如

  
      
  1. 猜猜:a,d,e结果:1

  2.   
  3. 猜猜:b,c,f结果:1

  4.   
  5. 猜猜:a,a,g结果:1

  6.   
  7. 猜猜:a,c,h结果:2

  8.   
  9. 猜猜:b,e,h结果:0

  10.   

猜测是由其他人做出的。我的目标是:

- 确定何时知道有关特定颜色的信息。

- 确定何时可以逻辑推断出未知集合。

在游戏开始时,没有颜色肯定在集合中或绝对不在未知集合中(假设N>1)。在产生0的猜测之后,已知该猜测的所有颜色都不在未知集合中。如果结果为k,那么已知该猜测的所有颜色都在未知集合中。我在编写程序时难以找出其中的所有案例。例如,在上一次猜测之前,对于任何颜色都不知道任何颜色。在最后一次猜测之后,该集合已知为a,c,c。逻辑是:

  • 到5时,b,e,h不在未知集合中
  • 到4时,a,c在未知集合中
  • 按1,d不在未知集合中
  • 按2,f不在未知集合中
  • 到3时,g不在未知集合中
  • 因此,未知集合中的唯一颜色是ac
  • 到3时,a不会多次出现在未知集合中。
  • 因此,未知集合为a,c,c

我可以通过这种方式处理逻辑,但我不确定如何对此进行编程。如果有人可以建议采用有条理的方式来实现它,那就太好了。 我更倾向于使用伪代码进行高级解释,而不是任何一种语言的完整实现。 谢谢。

4 个答案:

答案 0 :(得分:1)

直接的方法:建立可能组合的总人口。然后,随着猜测的进入,删除无法满足当前猜测结果的组合。一旦你只剩下一个组合,这就是解决方案。或者,在此过程的早期,当您不再使用特定颜色时,那个(显然)从可能的密码中删除了。

答案 1 :(得分:1)

您可以在每次猜测后对逻辑进行编码,如下所示。取一个长度为N的数组,如果i颜色在集合中,则+1的输入为i-1如果i 1}}颜色不在集合中0如果不知道i颜色是否在集合中。

每次猜测后,您都会创建满足结果的可能数组。如果猜测结果为r,那么可能的数组会有(k choose r)(如果有重复的颜色则会更少)。对于您的示例,数组(为了简洁起见,我使用的是+而不是+1-而不是-1

  1. (+,0,0,-,-,0,0,0) | (-,0,0,+,-,0,0,0) | (-,0,0,-,+,0,0,0)
  2. (0,+,-,0,0,-,0,0) | (0,-,+,0,0,-,0,0) | (0,-,-,0,0,+,0,0)
  3. (+,0,0,0,0,0,-,0) | (-,0,0,0,0,0,+,0)
  4. (+,0,+,0,0,0,0,-) | (+,0,-,0,0,0,0,+) | (-,0,+,0,0,0,0,+)
  5. (0,-,0,0,-,0,0,-)
  6. 现在,您可以在信息进入时检查各种可能性之间的一致性。第一次猜测后有3种可能性,每种可能性同等有效。在第二次猜测之后,有9种可能性(前3个中的1个和第3个中的1个)并且每个可能性都有效。在第三次猜测之后,有18种可能性,其中只有9种是有效的。这是因为3中的左选项需要从1开始的左选项,反之亦然。在第四次猜测之后,有5种有效的可能性。在第五次猜测之后,只有一种有效的可能性,即:

    1. (+,0,0,-,-,0,0,0)
    2. (0,-,+,0,0,-,0,0)
    3. (+,0,0,0,0,0,-,0)
    4. (+,0,+,0,0,0,0,-)
    5. (0,-,0,0,-,0,0,-)
    6. 现在已知包含/排除每种颜色。您可以以类似的方式处理多重性。

答案 2 :(得分:0)

Knuth described解决方案。我implemented

答案 3 :(得分:0)

所选项目:ade = 1 => 3种可能100,010,001

此行未知:bcfgh =? => 5项= 32种可能

将这些结合起来给出32 * 3 = 96个可能的答案

重复下一行并删除所有行不可能的行

直到只剩下一个