1. Windows 10
2. Python 3.7
Проблема: Написал функции, с помощью которых меняю элементы списка для игры в Судоку. При создании списка не через функцию, после вызова функции solve() элементы списка меняются, но если я создаю список через функцию fill(), то при тех же действиях список не меняется. Попробовал также копировать список, но это ничего не изменило. Не подскажете, ошибся ли я при создании списка через функцию?
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)
Последнее редактирование: