解决不平等数独的策略?

时间:2011-04-12 22:56:11

标签: python math sudoku

我最近遇到的经典数独求解器的一个转折是(相当疯狂)inequality sudoku,这是你的经典数独谜题,并且每个方框都添加了不等式条件。

现在,我已经设法在Python中删除了一个常规数独解算器(使用强力方法),但是我很难掌握用于解决此问题的方法。我是在思考它还是比普通的谜题复杂得多?

2 个答案:

答案 0 :(得分:2)

这只是约束解决。

如果您有一个数独板,那么,对于每个单元格(i,j),您都有这些限制:

board[i, j] in [1, 2, 3, 4, 5, 6, 7, 8, 9]
for each cell (a, j) where i != a: board[a, j] != board[i, j]
for each cell (i, b) where j != b: board[i, b] != board[i, j]

对于特定细胞,您已经知道它们的价值。这真的只是一个不同的约束:

board[c1, c2] == 7

就是这样。蛮力检查器可以简单地遍历每种可能的方式来填充板单元格(尤其是注意第一个约束),并检查这些约束是否成立。如果他们都持有该填写,那么它可以输出板。否则,它会继续前进。

如果现在允许特定位置的不等式,则可以使用完全相同的强力算法。在说正确填写电路板之前,这只是一个新的检查:

2 <= board[c3, c4] < 8

使用蛮力很容易,但使用像Prolog这样的逻辑编程语言或像Numberjack

这样的约束编程库也很容易

以下是上述所有约束的Numberjack版本(按出现顺序):

board[i, j] = Variable(1, 9)
# ... need to define all the board before you execute the following:
for a in xrange(1, 10):
    model.add(board[a, j] != board[i, j])
    model.add(board[i, a] != board[i, j])
model.add(board[c1, c2] == 7)
    model.add(board[c3, c4] < 8)
model.add(board[c3, c4] >= 2)

对于实际使用约束求解器而言,这不是惯用语。在现实生活中,不是单独指定!= s,而是使用“所有这些都不同”的约束,AllDiff等。但是你明白了。

答案 1 :(得分:0)

您可以修改Peter Norvig的solver来添加这些约束。