我的代码中使用递归回溯解决数独问题的错误是啥?

Posted

技术标签:

【中文标题】我的代码中使用递归回溯解决数独问题的错误是啥?【英文标题】:What is the error in my code to solve Sudoku problem using recursive-backtracking?我的代码中使用递归回溯解决数独问题的错误是什么? 【发布时间】:2019-12-21 12:59:15 【问题描述】:

我正在学习回溯和递归。我写了一个解决数独问题的代码,但我得到一个错误的输出,我不知道为什么?请帮帮我!

def print_sudoku(arr):
    for i in range(9):
        for j in range(9):
            print(arr[i][j], end = '')
        print('\n')


def empty_space(arr, l):
    for i in range(9):
        for j in range(9):
            if(arr[i][j] == 0):
                l[0] = i
                l[1] = j
                return True
    else:
        return False


def check_row(arr, row, num):
    for j in range(9):
        if arr[row][j] == num:
            return False
    return True


def check_col(arr, col, num):
    for i in range(9):
        if arr[i][col] == num:
            return False
    return True


def check_grid(arr, row, col, num):
    for i in range(3):
        for j in range(3):
            if arr[row + i][col + j] == num:
                return False
    return True


def solve_sudoku(arr):
    l = [0, 0]
    if not empty_space(arr, l):
        return True
    else:
        row = l[0]
        col = l[1]
        for k in range(1, 10):
            num = k
            if check_row(arr, row, num) and check_row(arr, row, num) and check_grid(arr, row - (row%3), col - (col%3), num):
                arr[row][col] = k
                if solve_sudoku(arr):
                    return True
                arr[row][col] = 0

        return False


if __name__ == "__main__":
    grid = [[0 for x in range(9)] for y in range(9)]

    grid = [[3, 0, 6, 5, 0, 8, 4, 0, 0],
            [5, 2, 0, 0, 0, 0, 0, 0, 0],
            [0, 8, 7, 0, 0, 0, 0, 3, 1],
            [0, 0, 3, 0, 1, 0, 0, 8, 0],
            [9, 0, 0, 8, 6, 3, 0, 0, 5],
            [0, 5, 0, 0, 9, 0, 6, 0, 0],
            [1, 3, 0, 0, 0, 0, 2, 5, 0],
            [0, 0, 0, 0, 0, 0, 0, 7, 4],
            [0, 0, 5, 2, 0, 6, 3, 0, 0]]

    if solve_sudoku(grid):
        print(' Sudoku Solved ')
        print_sudoku(grid)
    else:
        print("Sudoku can't be solved")

我得到的输出是这样的:

Sudoku Solved 
316578429
524139678
987246531
263415789
917863245
458297613
134789256
268135974
795246318

虽然正确的输出是:

  3 1 6 5 7 8 4 9 2
  5 2 9 1 3 4 7 6 8
  4 8 7 6 2 9 5 3 1
  2 6 3 4 1 5 9 8 7
  9 7 4 8 6 3 1 2 5
  8 5 1 7 9 2 6 4 3
  1 3 8 9 4 7 2 5 6
  6 9 2 3 5 1 8 7 4
  7 4 5 2 8 6 3 1 9

【问题讨论】:

【参考方案1】:

只是猜测:

if check_row(arr, row, num) and check_row(arr, row, num) and check_grid(arr, row - (row%3), col - (col%3), num):

您应该在这里致电check_col

【讨论】:

以上是关于我的代码中使用递归回溯解决数独问题的错误是啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法回溯以使用递归 javascript 数独求解器

Python数独回溯

数独回溯 无效数独

优化回溯算法求解数独

如何通过回溯和递归解决数独?

Java中的数独求解器,使用回溯和递归