【发布时间】:2011-12-04 03:33:59
【问题描述】:
我正在尝试将数独作为家庭作业的约束满足问题来解决。我已经为特定行中的所有元素以及列构建了约束。我正在尝试为子区域中不同的元素构建约束,但遇到了一些麻烦。
我当前算法背后的总体思路是将子区域中的所有变量(例如 9x9 网格的 3x3 框)添加到列表中,然后排列该列表中的所有值以构造 NotEqualConstraints每个变量之间。下面的代码适用于 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 中。如果您看到更好的方法,请分享见解
【问题讨论】:
-
啊,小伙子,你有什么问题?
-
给定的代码迭代从网格左上角开始的第一个子区域,但不是网格的每个子区域。
-
只是简单的算术,仅此而已。如果你在纸上算出来,你会立即看到算法。
-
我已经在纸上解决了一段时间,对我来说不是那么容易:/
标签: java constraints constraint-programming