Deutsch

Как решать подобные задачи?

09.01.24 14:02
Re: Как решать подобные задачи?
 
MrSanders коренной житель
в ответ AlexNek 07.01.24 21:00

Мне эта задачка напоминает NP-полную задачу... Как-то было про изменение строки, даны n операций (например перестановка, циклический сдвиг и т.п.), найти самую короткую комбинацию операций. Но извиняюсь, уже не помню.

А так - брутфорсим нафик. 10 позиций, 10 символов, каждый символ может оказаться на любой позиции, символы не повторяются - максимум 10! вариантов, 3.628.800, каждый вариант представляем десятичным числом. (вместо 10 будем 0 использовать), 10.000.000.000 вариантов в 64-х битный лонг запихнём. Даже все варианты в память влезут. Вообще ерунда :)

Начинаем строить словарь с уже полученными значениями (чтобы не зациклиться) и дерево переходов.

Начинаем с 0123456789. Добавили словарь. Добавляем переход - крутим по циклу А - 8023456791. Смотрим, есть ли такое словаре? Нету. Сравниваем с ожидаемым - не, не совпало? Добавили в словарь, добавили новый узекл, добавили переход с маркировкой "А". Повторяем для Б, потом для С и Д. Сделали для всех операций? Есть узел не этом же уровне? Переходим к нему. Нет? Спускаемся на уровень ниже, если можем. Если новое число совпало с каким-то из словаря - "отменяем ход", рисуем "стоп, сюда не ходи". В общем поиск в ширину.


Это 100% можно сделать умнее, каждая трансмутация меняет цифры только в определённых позициях, но оно надо? меньше 4 миллионов вариантов отщёлкает ну... за 30 секунд? Так как мы в ширину ищем, то первый найденный путь и будет самым коротким.

А вот если будет 20 вариантов, то тут уже приплыли :) Придётся искать какой-нить 4/3 алгоритм.

 

Перейти на