@stasushakov

Скорость объекта растёт в геометрической прогрессии с шагом 2. Есть команда реверса. Как попасть в нужную точку?

Суть проблемы: есть задача, есть моя реализация, которая выдает не совсем оптимальные результаты.

Задача:

Объект перемещается вдоль одной линии по поверхности. Линия поделена на блоки, и каждый блок пронумерован, включая блоки с отрицательными номерами. Отправная точка находится в блоке (позиции) 0. Начальная скорость объекта в этом блоке - "+1".

Объект понимает 2 команды:
* "A" - ускорение, при котором позиция изменяется на величину скорости (позиция += скорость), а скорость увеличивается вдвое (скорость *= 2);
* "R" - обратный ход, при котором объект разворачивается на месте и сбрасывает скорость до "+1" или "-1", т.е. знак изменяется на противоположный.

Например, если мы передаём инструкцию "AAR", то объект перемещается по блокам 0->1->3->3, а его скорость изменяется как 1->2->4->(-1).

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

На вход подаётся: целое число, обозначающее номер блока, в который должен попасть объект.
На выходе: натуральное число, обозначающее минимальное количество команд в инструкции, позволяющей достичь заданного блока.

Пример 1.
На входе: 3
Ответ: 2
Пояснение: наиболее оптимальная инструкция - "AA", которая позволяет переместить объект по блокам 0->1->3.

Пример 2.
На входе: 6
Ответ: 5
Пояснение: наиболее оптимальная инструкция - "AAARA", которая позволяет переместить объект по блокам 0->1->3->7->7->6.

Очень важно: объект не начинает движение сам по себе, а лишь реагирует на команды.

--------------------------------------

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

Есть ли способы решения данной задачи используя некие известные алгоритмы и/или математические подходы.
Может ли данная задача использоваться в качестве тестового задания на junior программиста?

Заранее благодарен.
  • Вопрос задан
  • 597 просмотров
Пригласить эксперта
Ответы на вопрос 3
profesor08
@profesor08
Все просто, двигаешь объект вправо до тех пор, пока целевая точка не совпадет, либо текущая позиция объекта не станет больше целевой, как только это случилось разворачиваешь его, и двигаешь до достижения цели. Все это дело придется выполнить в рекурсии, двигая объект туда-сюда.

P.S. Так как при команде R, объект сбрасывает скорость и разворачивается, то твой пример #2 не верный, раз он сбросил скорость и развернулся, то объект перемещался бы в сторону к нуля, и в позиции 6 не оказался бы. Это значит, что пересказ задачи очень, очень мягко говоря, не очень.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
кури графы
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Подозреваю (но не гарантирую), что задача относится к классу NP-полных, а значит точное её решение можно получить только полным перебором вариантов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы