AIM Tech Mini Marathon 1 |
---|
Закончено |
У вас есть робот, который находится в двумерном лабиринте из N × M клеток. Некоторые пары соседних по стороне клеток разделены стеной или дверью. Снаружи лабиринт со всех сторон окружен стенами. Некоторые клетки лабиринта являются выходами. Чтобы покинуть лабиринт, робот должен оказаться в любом из выходов. В некоторых клетках могут находиться ключи. Любой ключ может открыть любую дверь, но после открытия остается в замке. Таким образом, каждый ключ можно использовать лишь один раз. В лабиринте нет клеток содержащих и ключ, и выход. Также между парой соседних клеток не может находиться и стена и дверь.
Ваша задача написать программу на языке abc (описание языка находится ниже), которая приведёт робота к одному из выходов. Будем считать, что строки лабиринта пронумерованы от 0 до N - 1 сверху вниз, а столбцы – от 0 до M - 1 слева направо.
В языке abc доступны следующие базовые команды:
Также в языке abc доступны управляющие команды:
Обратите внимание, что управляющие и базовые команды могут вкладываться друг в друга произвольным образом.
Робот будет выполнять ваши команды последовательно пока не выйдет из лабиринта, не закончатся команды, не будет выполнена команда terminate или не будет превышено допустимое количество выполненных команд 5·106.
В языке abc каждая команда является отдельным словом и должна быть отделена от других команд хотя бы одним пробельным символом.
Вам необходимо написать программу, которая выведет последовательность команд, выводящую робота из лабиринта. Разумеется вам как хорошему программисту нужно оптимизировать эти последовательности команд.
Количество непробельных символов в последовательности команд не должно превышать 107. За успешный выход из лабиринта i вам будет начислено количество очков равное:
В случае, если ваша последовательность команд не приведет робота к выходу вам будет начислено 0 очков. Результатом вашей программы будет являться сумма всех Si. Эту величину вам нужно максимизировать.
Все лабиринты вам будут известны и доступны. Вы можете скачать архив с лабиринтами с помощью любой из ссылок указанных ниже, пароль для разархивации aimtechiscool:
Для удобства локального тестирования ваших программ вам будет доступна программа подсчёта вашего результата (чекер), а также визуализации лабиринта. Эта программа написана на языке python3, поэтому вам понадобится интерпретатор языка python3, а также библиотека pillow, которую вы можете установить, выполнив команду pip3 install pillow. pip3 – это утилита для установки пакетов (библиотек) python3, она автоматически устанавливается вместе с интерпретатором python3.
Пример запуска чекера и визуализатора: python3 aimmaze.py maze.in robot.abc --image maze.png. Чекер возможно запустить без визуализации: python3 aimmaze.py maze.in robot.abc. Флаг --output-log позволит увидеть информацию о каждом шаге робота: python3 aimmaze.py maze.in robot.abc --output-log. Обратите внимание, что python3 мог установиться как просто python.
Для настроек изображения вы можете редактировать константы в начале программы aimmaze.py.
В первой строке заданы целые числа i, W, N, M, x0, y0, C, D, K, E.
Координата x соответствует номеру строки, y – номеру столбца. Точка (0, 0) находится слева сверху, так что направление down увеличивает координату x, а направление right увеличивает координату y.
В следующих C строках содержатся по 4 числа в каждой x1, y1, x2, y2 – координаты клеток в 0-индексации, между которыми есть стена. Гарантируется, что |x1 - x2| + |y1 - y2| = 1, 0 ≤ x1, x2 ≤ N - 1, 0 ≤ y1, y2 ≤ M - 1. Также по границам лабиринта всегда есть стены, которые не даны в описании лабиринта.
В следующих D строках содержится описание дверей в том же формате, что и стен. Гарантируется, что двери не накладываются на стены.
В следующих K строках находятся пары чисел – координаты ключей в 0-индексации.
В следующих E строках находятся пары чисел – координаты выходов в 0-индексации.
Гарантируется, что стартовая позиция, ключи и выходы находятся в попарно различных точках.
Выведите программу на языке abc, которая проходит заданный лабиринт. Команды должны быть отделены друг от друга хотя бы одним пробельным символом. Форматирование программы не имеет значения.
1 1 30 30 1 1 1 1 1 1
1 1 1 2
2 2 2 3
1 4
9 0
for-1111
take
open-up
open-left
open-right
open-down
move-left
if-ok
for-11
move-left
take
open-up
open-left
open-right
open-down
end
else
move-right
if-ok
for-11
move-right
take
open-up
open-left
open-right
open-down
end
else endif
endif
move-up
if-ok
for-11
move-up
take
open-up
open-left
open-right
open-down
end
else
move-down
if-ok
for-11
move-down
take
open-up
open-left
open-right
open-down
end
else endif
endif
end
Название |
---|