Оператор печати работает в функции, но не в теле кода - PullRequest
2 голосов
/ 17 июня 2020

Python здесь новичок

Пишу скрипт для решения судоку. Большая часть кода взята из этого видео.

Функция работает и печатает решенную сетку, пока мой оператор печати находится в функции, но когда я помещаю его за пределы функции, он распечатывает исходный массив и не решенный массив.

Любая идея, почему это происходит и как я могу получить доступ к решенному массиву вне функции в теле кода.

Вы все можете игнорировать тестирование функций, потому что они работают, поскольку решенный массив распечатывается из функции, моя проблема в том, как его распечатать и получить к нему доступ из тела.

Я бы хотел, чтобы операторы печати 3 или 4 были решенным массивом.

Любая помощь приветствуется.

import numpy as np

sudoku_grid = np.array([[4, 0, 0, 0, 0, 1, 6, 3, 7],
                         [0, 6, 0, 0, 4, 0, 0, 5, 1],
                         [0, 0, 0, 6, 3, 0, 0, 0, 0],
                         [0, 2, 0, 0, 0, 8, 1, 0, 0],
                         [6, 0, 8, 9, 0, 5, 3, 0, 4],
                         [0, 0, 1, 4, 0, 0, 0, 8, 0],
                         [0, 0, 0, 0, 9, 3, 0, 0, 0],
                         [7, 8, 0, 0, 6, 0, 0, 1, 0],
                         [2, 3, 6, 1, 0, 0, 0, 0, 8]])

def possible(row, column, number, grid):
    """Checks whether a number can be inserted in a cell"""

    # Checking for duplicate number in row
    for i in range(9):
        if number == grid[row, i]:
            return False

    # Checking for duplicate number in column
    for j in range(9):
        if number == grid[j, column]:
            return False

    # Checking for duplicate number in grid
    # Returns 0,1,2 for row and column so basically 9X9 grid is reduced to 3X3 grid         
  and duplicated are checked within the same
    r = row//3*3
    c = column//3*3

    for k in range(r, r+3):
        for l in range(c, c+3):
            if number == grid[k, l]:
                return False

    return True


def solve(grid):
    """Solves sudoku using recursion and back tracking"""

    # use combination of row and column to get a cell
    for i in range(9):
        for j in range(9):

            # if cell is zero then tries to enter number
            if grid[i, j] == 0:
                for k in range(1, 10):

                    # Checks if number is possible and enters the same in array
                    if possible(i, j, k, grid):
                        grid[i, j] = k

                        # Recursion moves to next cell
                        solve(grid)

                        # Backtracks if not possible
                        grid[i, j] = 0

                # if no numbers are 0 then Solved and return array
                return grid
    print(grid, "\n Print statement 2(function print statement)")



print(sudoku_grid, "\n Print statement 1(Original grid b/f function)")
print("________________________")
x = solve(sudoku_grid)
print("________________________")
print(x, "\n Print statement 3")
print("________________________")
print(sudoku_grid, "\n Print statement 4")

1 Ответ

0 голосов
/ 17 июня 2020

Согласно вашей функции solve, ваш код либо:

  • возвращает сетку, либо
  • печатает сетку

Обратите внимание на return происходит внутри for цикла, а печать - после него. Если бы функция вернулась, печати не было бы.

Вы никогда не дойдете до этой части кода:

# if no numbers are 0 then Solved and return array
return grid

и это потому, что вы выполняете рекурсию без условия:

# Recursion moves to next cell
solve(grid)

Обратите внимание, что

        # if cell is zero then tries to enter number
        if grid[i, j] == 0:
            for k in range(1, 10):
               ...
               solve(grid)
               ...
            # if no numbers are 0 then Solved and return array
            return grid

сам по себе некогерентен, потому что вы вводите условие, в котором существует ячейка 0, но вы ожидаете возврата, если ни одна ячейка не равна 0 ... и даже если это произойдет, порядок ваших операторов не позволит сетка, которая должна быть возвращена, потому что вызов solve выполняется перед оператором return.

Итак, у вас должно быть условие, которое заставит вас не вызывать solve и вместо этого возвращать сетку - оба в той же области / условии не будут работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...