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