2011-04-12 47 views
2

我最近碰到的经典数独解算器的一个转折是(相当疯狂)inequality sudoku,这是你的经典数独谜题与添加扭曲,有不平等条件添加到每个盒子。解决不平等数独的策略?

现在,我设法在Python中划出了一个常规数独求解器(使用强力方法),但是我无法掌握用什么方法来解决这个问题。我是否在推翻它,还是比普通的难题复杂得多?

+0

背后的理论是,他们给你的数字给出多个答案,如果不平等不存在? – cohensh 2011-04-12 22:59:52

+0

还有,再加上他们没有给你数字的情况,只是一个充满不平等的董事会。 – Nathaniel 2011-04-13 00:35:59

回答

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) 

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

+0

Numberjack看起来很棒!感谢您向我介绍:) – Nathaniel 2011-04-13 01:56:04

+0

你会说什么将所有约束添加到模型的最佳方法是?我将棋盘表示为一个矩阵:board = Matrix(N * N,N * N,1,N * N,'cell _')和一个模型'sudoku',游戏。我应该只是添加一大堆不平等语句(即'sudoku.add(board [0] [0]> board [0] [1])等),还是有更有效的方式丢失? – Nathaniel 2011-04-14 04:29:36

+0

@Nathanial实际上我从来没有用过Numberjack,我只是用python约束解决库搜索并找到它。看起来好像它是'用于排队:sudoku.add(AllDiff(row))',而列则是相同的。 – 2011-04-14 06:31:18

0

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

+0

编辑:回复了错误的评论。谢谢你的提示,尽管解决者很棒。 – Nathaniel 2011-04-14 04:23:12