我尝试使用Python实现蛮力方法解决数独谜题,如以下链接所述:http://en.wikipedia.org/wiki/Sudoku_solving_algorithms#Brute-force_algorithm
我知道还有其他线程有同样的问题。我已经阅读了所有这些内容并仍然遇到问题。
这是我的递归代码:
def recurse(x, k, grid):
if x > 8:
for line in grid:
print line
raw_input()
if grid[x][k] == '0':
for number in '123456789':
if clear(number, x, k, grid):
grid[x] = grid[x][0:k] + number + grid[x][k+1:]
k += 1
if k > 8:
x += 1
k = 0
recurse(x, k, grid)
k -= 1
if k < 0:
x -= 1
k = 8
else:
k += 1
if k > 8:
x += 1
k = 0
recurse(x, k, grid)
基本上我将数独保存在9x9插槽的数组中,其中grid [x]访问整个Sudoku的第x行,而grid [x] [k]访问第x行的第k个数字。
有一个名为'clear'的功能可以找出某个数字是否适合该插槽。我已经多次测试它并且它正常工作。这里的问题是值'x'永远不会超过8,这意味着Sudoku永远不会到达终点。在正确填充所有插槽之前,递归停止。我在编写递归方法方面缺乏经验,所以请耐心等待。
我想,如果一个数字适合一个槽,则该数字放在该槽中,然后k递增。如果k大于8,则表示它是行的结尾,所以我们跳到下一行。然后再次调用递归函数。如果递归函数结束而无法再次调用自身,那么这意味着该插槽中没有数字,所以我们必须返回。在那种情况下,k递减。
这究竟是什么问题?
答案 0 :(得分:1)
你忘了在回溯之前重置细胞。你在整个地方留下了错误的数字,并且在某些时候没有任何有效数字可以填写,执行就会停止。
在
之后添加grid[x] = grid[x][0:k] + '0' + grid[x][k+1:]
k -= 1
if k < 0:
x -= 1
k = 8
解决这个问题。
在找到解决方案时停止递归:
def recurse(x, k, grid):
if x>8:
return grid
if grid[x][k] == '0':
for number in '123456789':
if clear(number, x, k, grid):
grid[x] = grid[x][0:k] + number + grid[x][k+1:]
k += 1
if k > 8:
x += 1
k = 0
solution= recurse(x, k, grid)
if solution:
return solution
k -= 1
if k < 0:
x -= 1
k = 8
grid[x] = grid[x][0:k] + '0' + grid[x][k+1:]
else:
k += 1
if k > 8:
x += 1
k = 0
return recurse(x, k, grid)