Трое новых русских рассказывают, какую пиротехнику подарили своим чадам на Новый Год:
— Я своему прикупил пять ящиков хлопушек…
— А я пять ящиков петард…
— А я своему ракету прикупил, тока, блин, каких-то космонавтов в нагрузку дали…
Теория
Космическая компания приняла вас на работу на должность “Разработчик кораблей и архитектор космических путей”. Это высокооплачиваемая работа, но и цена всему этому — сложные решения, которые придется вам принят во время работы.
Космос
Начнем с самого простого, как построена космическая карта. Космос будет представлен в виде графа с вершинами-системами и ребрами-космическими-путями.
Граф и ребра
Каждое ребро описывается последовательностью ячеек, каждая ячейка определяет позицию перемещения для корабля. Ячейки различаются на пустые и цветные.
Ребра как таковые не имеют направления, однако перемещение в одну сторону и в другую определяет чтение последовательности ячеек в ребре. Граф не имеет каких либо усложнений или необычных форм.
Перемещение по ребрам
Для перемещения кораблей из точки в точку используются … “кубики”. Кубики с 6-ю сторонами. Каждая сторона определяет количество возможных перемещений. Дополнительно с помощью цветовой маркировки указываются дополнительные “цветовые хода”. Каждый цветовой ход позволяет переместиться по ячейке с указанным цветом без ограничений на количество выпавших ходов, но только 1 ход на 1 цветовой ход. Например, если выпало 4 (3 черных и 1 зеленый), то корабль может переместится на 4 хода вне зависимости от цвета, или на 4 хода и 1 зеленый ход. Для других комбинаций используются аналогичные правила.
Каждый корабль оснащен двумя кубиками для хода. Кубики могут быть случайными и возможно даже не иметь определенного значения или иметь их несколько.
Пример:
Другой пример:
Пример перемещения
Рассмотрим передвижение на первом примере и с первым набором кубиков. Если представить ребро в виде
последовательности, то [2, 2, 3, 0, 1, 0, 0, 0, 2, 2, 0]
- путь от белой звезды до красной. Аналогично для кубиков.
Но в данном случае кубики в виде множества граней, где каждая грань представлена в виде последовательности:
[[0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [1, 3, 0, 0, 0], [1, 3, 4, 0, 0, 0]]
- для первого кубика и
[[0], [0, 0], [3, 0, 0], [2, 4, 0, 0], [0, 0, 0, 0, 0], [2, 2, 2, 0, 0, 0]]
- для второго.
Бросив кубики мы, например, получаем множество ходов: [0, 0, 0, 3, 0, 0]
, что означает 6 обычных ходов и один зеленый ход.
В случае выпадения другой комбинации: [1, 3, 4, 0, 0, 0, 3, 0, 0]
мы получаем 9 обычных ходов, 1 красный, 2 зеленых и 1 синий ход.
Рассмотрим ход на примере [0, 0, 0, 3, 0, 0]
. Если мы идем из белой звезды в красную, то выбросив такую комбинацию мы
передвинемся не на 6-ую по счету ячейку, а на 7-ую, так как зеленую клетку мы прошли за счет зеленого хода. Это означает,
что фактически у нас было 6 ходов и один цветной, 2 прошли, после зеленую клетку за счет зеленого хода пропустили и после прошли еще 4.
Точный формат кубиков будет определен позже.
Задача
Теперь о самой задаче. Вам требуется при данном графе и кубиках, определить наиболее выгодный маршрут.
Подготовка
На этапе подготовки ваши идеи, системы оценивания маршрутов, различные метрики и алгоритмы не ограничены входными и выходными данными. Продумайте способ оценки одного маршрута или сразу нескольких, подумайте о способе обхода путей между звездами.
Модели данных для решений
Теперь вам предоставлены модели данных в формате классов. Найти их можно в репозитории данной лабораторной работы.
Для полной работы вам потребуется установить часть модулей, однако если отрисовка для визуального анализа не нужна, то
в lab/__init__
удалите все связанное с draw.
Для простоты работы можно опять воспользоваться repl.it. При создании можно указать Import from GitHub
и передав
ссылку на данный репозиторий https://github.com/octo-gone/ifmsh-lab-spaceship.git
. Репл сам все установит.
Подготовка решения
Для простоты подготовки решения было решено использовать следующий подход. Решение должно находится в функции main
в файле solution.py
(файл требуется создать самостоятельно на том же уровне что и main.py
). Можно создавать другие, однако решение не
должно затрагивать файлы: main.py
, lab/__init__.py
, lab/generators.py
, lab/models.py
и lab/draw.py
.
def main(space, start, end, dice_1, dice_2):
pass