解不等式数独的策略?

2024-10-03 15:25:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近碰到的经典数独解算器的一个转折点是(相当疯狂的)inequality sudoku,这是你的经典数独谜题,增加了一个扭曲,即每个方框中都添加了不等式条件。在

现在,我已经设法在Python中创建了一个常规数独解算器(使用蛮力方法),但是我很难理解我将使用什么方法来解决这个问题。是我想得太多了还是这比一个普通的谜题复杂得多?在


Tags: 方法条件常规算器蛮力经典sudoku谜题
2条回答

您可以修改peternorvig的solver来添加这些约束。在

这只是约束求解。在

如果你有一个数独板,那么,对于每个单元格(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]

你知道他们的手机有什么特别的价值。这实际上是另一种约束:

^{pr2}$

就这样。一个暴力检查器可以简单地运行所有可能的方法来填充电路板单元(特别是注意第一个约束),并检查这些约束是否成立。如果他们都持有填补,那么它可以输出董事会。否则,它会继续下去。在

如果现在允许特定位置的不平等,可以使用完全相同的暴力算法。这只是一个新的检查,它必须做,然后才能说董事会填写正确:

2 <= board[c3, c4] < 8

使用brute-force很容易,但是使用像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,等等。但你明白了。在

相关问题 更多 >