我正在尝试将数独问题作为约束满足问题来解决,这是一项家庭作业。我已经为特定行和列的所有元素构建了互不相同的约束条件。我正在尝试构建子区域中元素互不相同的约束条件,并遇到一些麻烦。
我目前算法的基本思想是将所有位于子区域(例如9x9网格中的3x3框)中的变量添加到列表中,并对该列表中的所有值进行排列以构建每个变量之间的不等式约束。下面的代码适用于NxN网格的第一个子区域,但我不确定应该如何更改它以遍历整个网格的其余部分。
我目前算法的基本思想是将所有位于子区域(例如9x9网格中的3x3框)中的变量添加到列表中,并对该列表中的所有值进行排列以构建每个变量之间的不等式约束。下面的代码适用于NxN网格的第一个子区域,但我不确定应该如何更改它以遍历整个网格的其余部分。
int incSize = (int)Math.sqrt(svars.length);
ArrayList<Variable> subBox = new ArrayList<Variable>();
for (int ind = 0; ind < incSize; ind++) {
for (int ind2 = 0; ind2 < incSize; ind2++) {
subBox.add(svars[ind][ind2]);
}
}
for (int i = 0; i < subBox.size(); i++) {
for (int j = i + 1; j < subBox.size(); j++) {
NotEqualConstraint row = new NotEqualConstraint(subBox.get(i), subBox.get(j));
constraints.add(row);
}
}
有没有人能指导我如何修改代码,以便能够击中每个子区域,而不仅仅是左上角的那一个?
编辑:我也愿意尝试任何有效的算法,为每个子区域添加到ArrayList中不是必须的。如果您知道更好的方法,请分享您的见解。