Algorithm 在4个钉子和6种颜色的智囊团游戏中,如何计算5个非等价查询中的第一个查询?
我正在尝试建立一个通用的(任何数量的钉子和颜色)智囊团解决方案。很多文章都提到了这一点(Kenji Koyama;TW Lai.一个最佳策划策略),我在搜索后发现,对于一款4钉6色的策划游戏,1296个可能的代码中有5个非等效的查询,即0000、0001、0011、0012、0123。但没有提到这是如何计算的 问题1)如果我必须为任何钉子和颜色的组合(例如5,6或6,9)找到这个非等效列表,应该采用什么方法 问题2)是否有我可以使用或查看的现有算法或库来获得一些想法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
谢谢一个简单的算法是从所有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)值,找到初始探针的一般方法应该是什么?严格按照上面所说的做。列出所有可能的排列。排除旋转和以一个符号替换另一个符号的变体。