[Python] Sudoku solver using backtracking

Discussão em 'Python' iniciado por Stack, Outubro 24, 2024.

  1. Stack

    Stack Membro Participativo

    I am using this code to solve sudoku using backtracking algorithm but it, although giving right answer, is encountering the error of "memory limit exceeded" where I am trying to test it

    I think I am trapped in a loop somewhere!

    import numpy as np

    def sudoku_solver_util(mat, many, f_count):
    if many[0] >= 9 ** (81 - f_count):
    return False
    for i in range(9):
    for j in range(9):
    if mat[j] == 0:
    counter = 0
    for k in range(1, 10):
    counter += 1
    many[0] += 1
    if is_safe(mat, i, j, k, 0, f_count, many):
    mat[j] = k
    if sudoku_solver_util(mat, many, f_count):
    return True
    count = np.count_nonzero(mat)
    if many[0] >= 9**(81-f_count):
    return False
    mat[j] = 0
    if counter == 9:
    return False
    return True

    def row_is_safe(mat, i, j, k):
    return not k in mat[:]

    def col_is_safe(mat, i, j, k):
    return not k in mat[:,j]

    def grid_is_safe(mat, i, j, k):
    return not k in small_sudoku(mat, i, j)

    def is_safe(mat, i, j, k, counter, count, many):
    return row_is_safe(mat, i, j, k) and col_is_safe(mat, i, j, k) and grid_is_safe(mat, i, j, k)

    def small_sudoku(mat, i, j):
    return mat[(i//3)*3:(i//3)*3+3, (j//3)*3:(j//3)*3+3]

    def sudoku_solver(mat):
    many = [0]
    f_count = np.count_nonzero(mat)
    if sudoku_solver_util(mat, many, f_count):
    return mat
    else:
    return np.zeros((9,9))

    # input
    mat = np.zeros((9,9))
    for i in range(0,9):
    mat = list(map(int, input().split()))

    # output
    out_mat = sudoku_solver(mat)
    for row in out_mat:
    print(" ".join(map(str, row.astype(int))))

    Continue reading...

Compartilhe esta Página