递归回溯python数独

时间:2018-12-07 16:42:00

标签: python recursion backtracking sudoku

我正在尝试解决众所周知的数独问题。我在这里看到了一些帖子,但是它们采用了不同的方法,并且我一直想弄清楚如何构建代码已经无法正常工作。我正在尝试为任何N * N数独提供通用解决方案

def find_vacant(board,lst):
    for row in range(len(board[0])):
        for col in range(len(board)):
            if board[row][col] == 0:
                lst[0] = row
                lst[1] = col
                return True
    return False


def in_row(board,row,num):
    for col in range(len(board)):
        if board[row][col] == num:
            return True
    return False


def in_col(board,col,num):
    for row in range(len(board)):
        if board[row][col] == num:
            return True
    return False


def in_zone(board,row,col,num):
    for i in range(int(len(board)**0.5)):
        for j in range(int(len(board)**0.5)):
            if board[i+row][j+col] == num:
                return True
    return False


def safe_location(board,row,col,num):
    sqrt = int((len(board))**(0.5))
    if not in_row(board,row,num) and not in_col(board,col,num) \
            and not in_zone(board,row - row%sqrt,col - col%sqrt,num):
        return True
    return False


def solve_sudoku(board):
    lst = [0,0]
    if find_vacant(board,lst) is False:
        return True
    row = lst[0]
    col = lst[1]
    for num in range(1,len(board)+1):
        if safe_location(board,row,col,num) is True:
            board[row][col] = num
            if solve_sudoku(board):
                return board
            board[row][col] = 0
    return False

我基本上是想弄清楚为什么我编写的代码在逻辑上不正确,以及我可能会缺少什么。 谢谢!

解决了! 更新了将来使用的工作代码:)

0 个答案:

没有答案