Загрузка [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js

Подразделы

Другие разделы

Дата и время

14/03/2025 17:26:09

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printРазбор задачи

Задачу можно представить как ориентированный граф, в котором вершины соответствуют числам от 0 до 2n-1. Дуги соединяют числа, которые могут следовать друг за другом в числе Уробороса.
1272.jpg
В этом графе нужно построить замкнутый путь, проходящий по всем вершинам графа только один раз. Это известная задача о построении Гамильтонова цикла, которая в общем случае является NP-полной, т.е. время решения будет расти экспоненциально от числа вершин. Хотя на данном графе хорошо работает рекурсивный перебор, так как возврат при переборе необходим достаточно редко, и для n=21 на построение Гамильтонова цикла требуется около 1 секунды. Но для организации рекурсии требуется либо большой стек, поддерживаемый не во всех компиляторах, либо довольно сложный код. Лучше построить другой граф, в котором вершинами служат числа от 0 до 2n-1-1 бит, а дуги пронумерованы числами от 0 до 2n-1. Дуга с номером x соединяет вершины с номерами [x2], т.е. (n-1) старших бит номера дуги, и x , т.е. (n-1) младших бит номера дуги.
1273.jpg
В этом случае задача сводится к построению Эйлерова цикла, что выполняется за время O(2^n). Минимальное число Уробороса можно получить, если начать путь с дуги 00..0.
loading