Python中的暴力数独递归

时间:2015-01-19 17:04:23

标签: python recursion sudoku

我尝试使用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递减。

这究竟是什么问题?

1 个答案:

答案 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)