Вот несколько советов высокого уровня по вашей программе.Я предполагаю, что при каждом движении ноль поменяется местами с числом, которое находится на расстоянии одного или двух слотов от нуля.Я также предполагаю, что вы хотите найти наименьшее количество ходов, которое приведет вас от первоначального списка к «желаемому результату», и что распечатка должна показывать все позиции от начальной позиции до желаемого результата.
Если вы знакомы с теорией графов (также называемой теорией сетей), вы можете легко решить свою проблему, выполнив поиск в ширину от начальной позиции до любой желаемой позиции.Узлами на вашем графике являются 5 040 возможных перестановок, и два узла имеют грань между ними, если вы можете перейти от одной позиции к другой за один ход.
Если вы не знаете теорию графов, вы можетеиспользуйте этот следующий подход.Вы можете использовать две общие структуры данных: очередь (например, collection.deque ) и словарь.Поместите начальную позицию в очередь.Также поместите его в качестве ключа в словаре со значением None
.
Затем запустите цикл.При каждом проходе по циклу удаляйте одну позицию из очереди.Из этой позиции будет не более четырех возможных ходов: поменяйте местами ноль с позицией 2 слева, 1 слева, 1 справа или 2 справа от нуля.(Если ноль находится в конце или около конца, возможных ходов будет меньше.) Для каждого из этих ходов, если результирующей позиции еще нет в словаре, добавьте ее в очередь и словарь.Значение словарной записи - это позиция, которую вы только что заняли в очереди.Если полученная позиция уже есть в словаре, ничего не делать.
Теперь проверьте, является ли полученная позиция «желаемым результатом».Если нет, продолжайте цикл.Если это так, используйте словарь, чтобы сохранить все ходы от желаемого результата обратно в исходное положение.Затем распечатайте эти позиции в нужном порядке, и все готово - прервите цикл.
Обратите внимание на три аспекта этого подхода.Во-первых, если какая-либо последовательность ходов достигает желаемого результата, этот подход выведет одну из самых коротких последовательностей.Во-вторых, не все перестановки исходной позиции генерируются.Перестановки генерируются по одной, пока не будет достигнут желаемый результат - больше не нужно.В-третьих, печать не производится до тех пор, пока не будут выполнены все ходы и не выбраны хорошие ходы.Это потому, что большинство ходов не окажутся полезными, поэтому мы ждем, пока не узнаем, какие из них полезны.
Если вы хотите получить больше информации, покажите еще какую-нибудь свою работу.Но перед этим скажите, правильно ли я понял правила вашей проблемы.