Список не изменяется при вызове функции

Artěmy

Новичок
Пользователь
Июн 27, 2021
1
0
1
1. Windows 10
2. Python 3.7
Проблема: Написал функции, с помощью которых меняю элементы списка для игры в Судоку. При создании списка не через функцию, после вызова функции solve() элементы списка меняются, но если я создаю список через функцию fill(), то при тех же действиях список не меняется. Попробовал также копировать список, но это ничего не изменило. Не подскажете, ошибся ли я при создании списка через функцию?
Python:
# Нужно заменить все нули на цифру от 1 до 9, при чем, в каждой строке,
# столбце и квадрате из 9 цифр, все цифры разные
def find_empty(board):
    for i in range(len(board)):
        for j in range(len(board[0])):
            if board[i][j] == 0:
                return i, j
    return None


def valid(board, num, pos):  # Проверка по линиям, столбцам и квадратам
    for i in range(len(board)):  # Проверяю по линиям
        if board[pos[0]][i] == num and pos[1] != i:  # pos[0] - индекс списка в board (линия), pos[1] -
            # индекс элемента (столбец)
            return False

    for i in range(len(board)):  # Проверяем по столбцам
        if board[i][pos[1]] == num and pos[0] != i:
            return False
    # Проверяю квадрат из 9 чисел
    box_x = pos[1] // 3  # Начальный индекс для определения длины квадрата
    box_y = pos[0] // 3  # Тож самое, только это его высота
    for i in range(box_y*3, box_y*3 + 3):  # Шаримся в пределах 3х списков (3 линии чисел в этом квадрате)
        for j in range(box_x*3, box_x*3 + 3):  # Три слолбца элементов списка
            if board[i][j] == num and (i, j) != pos:
                return False
    return True


def solve(board):  # НАЧАЛО
    empty = find_empty(board)  # Находим список и индекс ближайшего 0
    if not empty:
        return True  # Когда таблица заполнена
    else:
        row, column = empty
    for i in range(1, 10):  # Перебираем варианты замены 0
        if valid(board, i, (row, column)):  # Проверяем, подходит ли цифра в данном списке
            board[row][column] = i  # Если да, то меняем ноль на нее

            if solve(board):  # С новым значением заполняю остальной список
                return True

            board[row][column] = 0  # Если с новым значением не получилось, ищу другое для предыдущего
    return False


def show(board):  # Просто для вывода
    for i in range(len(board)):

        if i % 3 == 0 and i != 0:
            print("-"*24)

        for j in range(len(board[0])):
            if j % 3 == 0 and j != 0:
                print(" | " + str(board[i][j]), end=" ")
            else:
                print(board[i][j], end=" ")
        print()


def fill():  # Заполнение рандомными значениями
    import random
    l = []
    for i in range(9):
        l.append([random.randrange(1, 10) for e in range(9)])
    for i in range(len(l)):  # Если находится повторение, оно просто заменяется на ноль
        for j in range(len(l[0])):
            if not valid(l, l[i][j], (i, j)):
                l[i][j] = 0
    return l



b = [
        [7, 8, 0, 4, 0, 0, 1, 2, 0],
        [6, 0, 0, 0, 7, 5, 0, 0, 9],
        [0, 0, 0, 6, 0, 1, 0, 7, 8],
        [0, 0, 7, 0, 4, 0, 2, 6, 0],
        [0, 0, 1, 0, 5, 0, 9, 3, 0],
        [9, 0, 4, 0, 6, 0, 0, 0, 5],
        [0, 7, 0, 3, 0, 0, 0, 1, 2],
        [1, 2, 0, 0, 0, 7, 4, 0, 0],
        [0, 4, 9, 2, 0, 6, 0, 0, 7]
]  # Список с рандомными значениями (без повторений)

show(b)
print("Результат:", end="\n\n")
solve(b)
show(b)
print()

print("Список заполненный в функции", end="\n\n")
bl = fill()
show(bl)
print("Результат:", end="\n\n")
solve(bl)
show(bl)
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Все просто - с большинством вариантов которые возвращает fill вообще нельзя составить правильное судоку и функция solve после всех попыток возвращает False, так и не изменив список
 

Форум IT Специалистов