Хорошо, прошло много времени с тех пор, как я работал на python. Но в основном я делаю классическую задачу из 8 задач, поэтому с учетом строки, такой как «12-453786», моя программа решает ее для желаемого «12345678-». В настоящее время я использую поиск в ширину, чтобы решить эту проблему, и сохраняю посещенные узлы и узел, полученный в следующем примере. Однако, чтобы проследить путь или количество ходов, которые фактически требуются для завершения головоломки, мне нужно иметь возможность начать с решенного кортежа и проследить мой путь назад через мой список кортежей до начального состояния
Я былподумайте о том, чтобы сделать какое-то время, пока решено! = цикл начального запуска, но это не сработает.
def breadth_first_search(puz):
qu = queue.Queue()
laststate=""
qu.put((puz, laststate))
startstate=puz
visited=[]
#visited[puz] = puz
while queue:
puz = qu.get()
visited.append(puz)
pos = puz[0].index('-')
nebs = neighborcells(pos)
#print(*visited)
if puz[0] == "12345678-":
break
else:
for i in nebs:
swapped=swap(puz,i,pos)
if swapped in visited:
pass #?
else:
qu.put((swapped, puz[0]))
#some sort of linked list like function to get the path of result to start
#here
ПРИМЕР ПОСЕЩЕННЫХ УЗЕЛ (список кортежей)
[('12-453786', ''),
('1-2453786', '12-453786'),
('12345-786', '12-453786'),
('-12453786', '1-2453786'),
('12-453786', '1-2453786'),
('1524-3786', '1-2453786'),
('1234-5786', '12345-786'),
('12345678-', '12345-786')]
Ожидаемый результат для этого конкретногоголоволомка должна быть 2 хода