4

我正在用 C 语言开发一个客户端/服务器策划游戏,到目前为止我已经完成了。我的程序正在运行,平均 6 到 7 次猜测它就解决了这个秘密。然后我浏览了互联网,发现了 Donals Knuths 的方法:

  1. 创建一组剩余的可能性(此时有 1296 个)。第一个猜测是aabb。
  2. 如果它们是答案,则从 S 中删除不会给出相同分数的彩色和白色钉子的所有可能性。
  3. 对于每个可能的猜测(不一定在 S 中),计算每个可能的彩色/白色分数从 S 中消除多少可能性。猜测的分数是这些值中最小的。以最高分(minimax)进行猜测。
  4. 回到步骤 2,直到你做对了。

我这里要说的是,我用了5个位置和8种颜色。

当我试图优化我的程序时,我很难理解第 3 步的样子,特别是计算什么猜测会消除最多的可能性。

我所知道的是我必须查看每个元素并将其与其他元素进行比较,但我不确定如何比较它,因为我没有任何白色/黑色值。我想知道我怎么知道满足某些条件的条目会消除最大的可能性。

4

1 回答 1

3

我在我的博客上讨论了算法并给出了一个实现(用 Scheme,而不是 C)。棘手的部分是 minimax 函数中的这个谓词:

(or (< size min-size)
    (and (= size min-size)
         (member (car ps) pool)
         (not (member min-probe pool))))

您必须阅读整篇博文才能了解详细信息,但这基本上实现了 Knuth 的“服从”要求:如果探测器是新的最小值,或者等于当前最小值,则它是池,并且当前最小值不是池的成员,保持它为新的最小值,否则循环到下一个探测。

于 2013-03-22T14:05:26.123 回答