Algorithm 在4个钉子和6种颜色的智囊团游戏中,如何计算5个非等价查询中的第一个查询?

Algorithm 在4个钉子和6种颜色的智囊团游戏中,如何计算5个非等价查询中的第一个查询?,algorithm,language-agnostic,combinatorics,Algorithm,Language Agnostic,Combinatorics,我正在尝试建立一个通用的(任何数量的钉子和颜色)智囊团解决方案。很多文章都提到了这一点(Kenji Koyama;TW Lai.一个最佳策划策略),我在搜索后发现,对于一款4钉6色的策划游戏,1296个可能的代码中有5个非等效的查询,即0000、0001、0011、0012、0123。但没有提到这是如何计算的 问题1)如果我必须为任何钉子和颜色的组合(例如5,6或6,9)找到这个非等效列表,应该采用什么方法 问题2)是否有我可以使用或查看的现有算法或库来获得一些想法 谢谢一个简单的算法是从所有1

我正在尝试建立一个通用的(任何数量的钉子和颜色)智囊团解决方案。很多文章都提到了这一点(Kenji Koyama;TW Lai.一个最佳策划策略),我在搜索后发现,对于一款4钉6色的策划游戏,1296个可能的代码中有5个非等效的查询,即0000、0001、0011、0012、0123。但没有提到这是如何计算的

问题1)如果我必须为任何钉子和颜色的组合(例如5,6或6,9)找到这个非等效列表,应该采用什么方法

问题2)是否有我可以使用或查看的现有算法或库来获得一些想法


谢谢

一个简单的算法是从所有1种颜色开始。 这将准确地告诉您溶液中存在多少这种颜色

如果没有匹配,请继续选择所有一种颜色,直到至少有一种匹配为止。 我们称之为color1

现在,将一种颜色放在位置1,并用另一种颜色填充其余颜色。 如果您得到两个匹配项(游戏中有两个黑色小钉子),您就知道color1的位置正确。 如果你得到两个相近的匹配(游戏中有两个白色的小钉子),你就知道颜色1不在位置1

重复相同的步骤,在位置2使用颜色1。。4每次使用新颜色

一旦你到达位置4,你就知道所有颜色1的位置,你也知道所有其他颜色


最多还有2种其他解决方案可供尝试,这远远低于10次猜测的限度

检查互联网上的术语“整数分区”。它是组合数学中的一个基本数学术语。你要找的是“配分函数”p(n)。下面是C++中的一个示例:

#include <iostream>
#include <vector>

using namespace std;

// recursive function calculates the partitions of n
int part(int n, int level = 0) {
  static vector<int> v(n);
  static int pcount;
  int first;

  if (n < 1) return 0; // end of recursion
  v[level] = n;

  // comment next lines out, if you are only intereseted
  // in the total number
  cout << pcount << ". ";
  for (int i = level; i >= 0; --i)
    cout  << v[i] << " ";
  cout << endl;

  pcount++;
  first = (level == 0) ? 1 : v[level - 1];

  for (int i = first; i <= n / 2; i++) {
    v[level] = i;
    part(n - i, level + 1); 
  }
  return pcount;
}

int main() {
  int pegs = 5; // change this for other mastermind var.
  cout << "p(" << pegs << ") = " << part(pegs) << endl;
}
#包括
#包括
使用名称空间std;
//递归函数计算n的分区
整数部分(整数n,整数级别=0){
静态向量v(n);
静态整数计数;
int优先;
if(n<1)返回0;//递归结束
v[水平]=n;
//如果您只感兴趣,请将下一行注释掉
//总数

cout Knuth给出了这个问题的解决方案。它太大了,无法在这里作为答案显示,但我在上讨论了理论并给出了一个实现。感谢你的博客。它对于更好地理解Knuth的alog非常有用。如果你能从你的博客中详细说明,作为获得初始探测的通用算法,什么可以“基本上有五种可能的起始探针:11、11、12、1、2、1、2、3和1、2、4(旋转被排除在外,因为是一致地用一个符号替换另一个符号的变体)”@user448810-对于较大的c(颜色)和p(PEG)值,找到初始探针的一般方法应该是什么?严格按照上面所说的做。列出所有可能的排列。排除旋转和以一个符号替换另一个符号的变体。