【问题标题】:Brute Force Sudoku Recursion in PythonPython中的蛮力数独递归
【发布时间】:2015-01-19 17:04:23
【问题描述】:

我尝试使用 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] 访问整个数独的第 x 行,而 grid[x][k] 访问第 x 行的第 k 个数字。

上面有一个名为“clear”的函数,它可以确定某个数字是否可以放入该插槽。我已经对其进行了多次测试,并且可以正常工作。这里的问题是“x”的值永远不会超过 8,这意味着数独永远不会到达终点。在正确填充所有插槽之前,递归停止。我在编写递归方法方面非常缺乏经验,所以请多多包涵。

我想,如果一个数字适合一个槽,那么这个数字就会放在那个槽内,然后 k 递增。如果 k 大于 8,则意味着它是行尾,所以我们跳到下一行。然后再次调用递归函数。如果递归函数结束而无法再次调用自己,那么这意味着没有数字适合该插槽,因此我们必须返回。在这种情况下,k 递减。

那么这里到底有什么问题呢?

【问题讨论】:

    标签: python recursion sudoku


    【解决方案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)
    

    【讨论】:

    • 你说得对.. 非常感谢。好吧,您知道当 x > 8 时如何完全停止递归吗?
    • 返回网格不起作用,与解决方案混淆,因为它不断回溯并更改答案。
    • 我不明白。我很确定返回的解决方案是正确的。
    • 如果我在 x > 8 时立即打印网格,则解决方案是正确的。如果我在整个递归完成后打印网格,则解决方案是错误的。 ://
    • 您在使用我发布的代码吗?您确定要打印 solution 吗? solution = recurse(0, 0, sudoku).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多