рекурсивный откат питона судоку - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь решить известную проблему судоку.Я видел здесь несколько постов, но у них другой подход, и я хотел выяснить, почему сборка кода уже не работает.Я пытаюсь дать общее решение для любого 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

Я в основном пытаюсь выяснить, почему написанный мной код неверен логически, и что я могу упустить.Спасибо!

Исправлено!ОБНОВЛЕНО РАБОЧИЙ КОД ДЛЯ БУДУЩЕГО ИСПОЛЬЗОВАНИЯ:)

...