GOOGLE ADS

понедельник, 9 мая 2022 г.

Взятие обновленной переменной в конце цикла for для использования в том же цикле for в python

Я новичок в программировании, и у меня возникли проблемы с работой над решателем судоку. Я сделал цикл for, который проходит через каждую пустую позицию в судоку и находит возможные числа для каждого пустого места. Если есть только возможный ответ для этого места, судоку обновляется, помещая это число в эту конкретную позицию. Когда цикл завершается, он дает мне обновленную версию судоку, в которой пробелы, на которые был только 1 возможный ответ после заполнения пробелов перед ними, были заполнены.

Вот пример того, что он получает в каждом цикле. Каждая строка обозначает каждое из 81 пробелов в судоку и содержит возможные числа для этого конкретного пробела в списке и координаты (X-номер строки-номер столбца-номер квадрата 9x9, на который разделена судоку).

['1', '2', '4', '5'] X0-0-0
['1', '4'] X0-3-1
['1', '2', '4', '7'] X0-4-1
['4', '7'] X0-5-1
['1', '7'] X0-6-2
['7', '9'] X0-7-2
['1', '2', '3', '4'] X1-0-0
['2', '3', '4'] X1-1-0
['1', '2'] X1-2-0
['1', '2', '4', '7'] X1-4-1
['1', '7'] X1-8-2
['1'] X2-0-0
['2', '3', '5'] X3-0-3
['2', '5', '9'] X3-2-3
['4', '8'] X3-5-4
['3'] X3-6-5
['4', '5', '9'] X3-7-5
['5', '8', '9'] X3-8-5
['3', '8'] X4-1-3
['5'] X4-3-4
['8'] X4-5-4
['6'] X4-6-5

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

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

Это цикл for:

num2 = -1
for num in solución:
pos2 += 1
#Si el número es una incógnita
if num[0] == 'X':
posibles = []
#Metemos las posibles soluciones a cada incógnita en una lista
for i in range(1,10):
if str(i) not in sol_filas[int(num[1])] and str(i) not in sol_columnas[int(num[3])] and str(i) not in sol_cuadros[pos_cuadro(int(num[1]),int(num[3]))]:
posibles.append(str(i))
print(posibles,num)
# Si la lista de posibles soluciones solo tiene un elemento es porque solo hay una opción
if len(posibles) == 1:
solución[pos2] = posibles[0] #Actualizamos la lista con el valor correcto
sol_filas[int(num[1])][int(num[3])] = posibles[0]
sol_columnas[int(num[3])][int(num[1])] = posibles[0]
sol_cuadros[pos_cuadro(int(num[1]),int(num[3]))][3*((int(num[1])%3))+((int(num[3])%3))] = posibles[0]
print(solución)
print(solución)

Решение проблемы

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

while True:
improved = False
for num in solución:
.... #your code
# when you fill in a number set improved to True
if improved = False:
#this means we can't do any better the loop will go forever
break # we leave the loop

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...