Я, кажется, попал в засолку. Буквально. Я бросил на пол кучу солений, и теперь они разбросаны! Мне нужно, чтобы ты помог мне собрать их всех. О, я упоминал, что у меня в команде куча роботов? (Они также разбросаны повсюду; я очень плохо организовываю вещи.)
Вы должны принять участие в виде:
P.......
..1..2..
.......P
........
P3PP...4
.......P
то есть, несколько строк либо .
, P
(рассол), или цифра (ID робота). (Вы можете предположить, что каждая строка имеет одинаковую длину и дополнена .
.) Вы можете вводить эти строки в виде массива, либо вводить из STDIN, либо читать в отдельной строке через запятую, либо читать файл, либо делать все, что захотите. хотел бы принять участие.
Ваш вывод должен быть в виде n
линий, где n
находится самый высокий идентификатор робота. (Идентификаторы робота всегда будут последовательными, начиная с 1.) Каждая строка будет содержать путь робота, образованный из букв L
(слева), R
(справа), U
(вверх) и D
(вниз). Например, вот пример выходных данных для этой загадки:
LLU
RDR
LRRR
D
Это также может быть
LLU RDR LRRR D
Или
["LLU","RDR","LRRR","D"]
Или любой формат, который вы хотите, если вы можете сказать, каким должно быть решение.
Ваша цель - найти оптимальный результат, который имеет наименьшее количество шагов. Количество шагов считается наибольшим количеством шагов от всех роботов. Например, в приведенном выше примере было 4 шага. Обратите внимание, что может быть несколько решений, но вам нужно вывести только одно.
Подсчет очков:
- Ваша программа будет запущена с каждым из 5 (случайно сгенерированных) тестовых случаев.
- Вы должны добавить шаги каждого запуска, и это будет ваш счет.
- Наименьший общий, совокупный счет выиграет.
- Вы не можете жестко кодировать для этих конкретных входов. Ваш код также должен работать для любого другого ввода.
- Роботы могут проходить друг через друга.
- Ваша программа должна быть детерминированной, т.е. один и тот же вывод для каждого запуска. Вы можете использовать генератор случайных чисел, если он засеян и постоянно генерирует одинаковые числа кроссплатформенных.
- Ваш код должен быть запущен в течение 3 минут для каждого из входов. (Желательно намного меньше.)
- В случае ничьей победит большинство противников.
Вот тестовые случаи. Они были сгенерированы случайным образом с помощью небольшого сценария Ruby, который я написал.
P.......1.
..........
P.....P...
..P.......
....P2....
...P.P....
.PP..P....
....P....P
PPPP....3.
.P..P.P..P
....P.....
P....1....
.P.....PP.
.PP....PP.
.2.P.P....
..P....P..
.P........
.....P.P..
P.....P...
.3.P.P....
..P..P..P.
..1....P.P
..........
.......2P.
...P....P3
.P...PP..P
.......P.P
..P..P..PP
..P.4P..P.
.......P..
..P...P...
.....P....
PPPP...P..
..P.......
...P......
.......P.1
.P..P....P
P2PP......
.P..P.....
..........
......PP.P
.P1..P.P..
......PP..
P..P....2.
.P.P3.....
....4..P..
.......PP.
..P5......
P.....P...
....PPP..P
Удачи, и не позволяйте соленым там сидеть слишком долго, иначе они испортятся!
Ох, а почему соленья, спросите вы?
Почему бы нет?
источник
Ответы:
Рубин, 15 + 26 + 17 + 26 + 17 = 101
Робот находит соленья!
Хорошо, вот базовый уровень, чтобы начать людей, используя следующий супер наивный алгоритм:
Вот как это выглядит для Test Case # 1:
Очевидно, это не очень хорошо, но это начало!
Код:
Вводит данные в STDIN в точном формате кодового блока тестового примера в исходном вопросе. Вот что он печатает для этих тестов:
источник
Python, 16 + 15 + 14 + 20 + 12 = 77
У меня действительно нет никакого опыта работы с проблемами типа коммивояжера, но у меня было немного времени, поэтому я решил попробовать. В основном он пытается выделить каждому боту определенные огурцы, пройдя его предварительным ходом, где они выбирают тех, кто ближе к ним и самый дальний от других. Затем он перебирает наиболее эффективный способ для каждого бота собирать выделенные ему соленья.
Я действительно понятия не имею, насколько жизнеспособен этот метод, но я подозреваю, что он не будет работать хорошо для больших плат с меньшим количеством ботов (четвертая доска уже иногда занимает более двух минут).
Код:
Вывод:
источник