1
P:S:我从元线程了解到代码解释也可以在堆栈溢出时询问。亚里士多德数拼图解释
我想从this网站了解亚里士多德数字拼图的求解器。我明白了一点,直到当我们用高斯消元法排减,发现如下:
a = 76 - j - k - n - 2o - p - r - s
b = j + n + o
c = -38 + k + o + p + r + s
d = j + k + o
e = -38 + k + n + o + p + r
f = 38 - j - k - n - o - p
g = 38 - k - o - r
h = -38 + n + o + p + r + s
i = 38 - j - k - n - o - r
l = 38 - p - s
m = 38 - n - o - p
q = 38 - r - s
代码的作者接着说:
现在,走规模7的每个排列从{1 ,2,...,19},将其分配给独立变量,生成相关变量并根据约束进行测试,直到找到解决方案。
我真的不理解这个概念。特别是在this C文件,我不理解以下两个功能:
bool next_permutation(void)
{
for (int x = 6; x >= 0; x--) {
indices[x]++;
if (indices[x] == 19) {
if (!x) {
return false;
}
moveback(x, 18);
indices[x] = x;
continue;
}
swap(x, indices[x]);
break;
}
j = elem[0];
k = elem[1];
n = elem[2];
o = elem[3];
p = elem[4];
r = elem[5];
s = elem[6];
return true;
}
// adds values to set
// returns true if value successfully added; false otherwise
bool add(int value)
{
if (value > 19 || value < 1) {
return false;
}
int bit = 1 << value;
if (set & bit) {
return false;
}
set |= bit;
return true;
}
我将十分感谢,如果有人能帮助我理解这个求解。请注意,作者使用python脚本来减少行数。
第二个函数add,使用一个bitset来检查值是否已经在集合中。 'bit = 1 << value'将该值编码为一个二进制集合(位置1的1,位置2的2,位置3的3等)。如果值在集合中,set&bit返回true,在这种情况下,该值不会被添加(即已经存在 - >返回false),否则将其添加到集合中(使用OR操作'| = ) – MrE
另一个函数只是将索引洗牌以获得一个集合,旋转7个值,当达到结尾时交换和推回值。 – MrE