Вы путешественник, пересекающий пустыню между двумя городами. Вы не можете нести достаточно воды, чтобы пройти без остановки. Это вариация классической головоломки.
Правила
Пустыня выглядит так: WxH сетка в основном пустого пространства. Помеченное место S
- это место, где вы начинаете, E
где вы хотите закончить, а квадрат, помеченный числом N, содержит N единиц воды. Квадраты помечены .
нулевой водой.
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Вы начинаете с S с 5 единицами воды.
Вы можете нести не более 5 единиц воды.
Каждый ход ты
- переместиться на одну клетку вверх, вниз, влево или вправо,
- потреблять 1 единицу воды, которую вы несете,
- взять или уронить некоторое количество единиц воды.
Поворот является нотирован таким образом: (direction)(+|-)(units of water)
, +
означает , что вы собираете воду, -
что вы уронить.
Пример поворотов:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
Если вы выполните эти шаги, начиная с S в примере выше, пустыня будет выглядеть так потом.
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Вы можете собрать не больше воды, чем уже есть на вашей площади. Когда вы берете воду, вычтите это количество единиц из числа плитки.
Вы можете взять только воду, чтобы вместить максимум 5 единиц.
Ни одна плитка не может содержать более 9 единиц, кроме S, которая содержит единицы бесконечности.
Вы можете сбросить только столько воды, сколько у вас сейчас есть.
Вода на земле остается неизменной до тех пор, пока вы не поднимите ее снова.
Если вы вернетесь к S, вы можете собрать любое количество воды, не истощая ее.
Если вы достигнете E, то вы выиграете . Вы по-прежнему выигрываете, если вы потребляете свою последнюю единицу воды на E.
Если после вашего хода у вас будет ноль воды и вы не на E, вы умрете .
Вход и выход
Ваша программа получит стартовую карту произвольного размера STDIN
в формате ASCII в формате выше. Вы можете предположить, что это прямоугольник, то есть все строки одинаковой длины, что существует ровно один S
и один E
квадрат, все строки заканчиваются \n
, и весь STDIN будет соответствовать этому регулярному выражению:/^[SE1-9\.\n]+$/
Ваша программа запишет следующий вывод в STDOUT:
- список ходов,
- окончательное состояние карты.
Вы можете вывести список ходов в любом удобном формате.
Конечное состояние карты будет напечатано в том же формате, что и входные данные, за исключением того, что на нем дополнительно будет показан маршрут, по которому вы прошли через пустыню , пометив все посещенные плитки #
, если эта плитка не содержит воды и не является S или E (т.е. это так .
).
Пример ввода:
.....S.
.......
.......
E......
....8..
ПРИМЕР: победный вывод:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
Нетривиальность
Когда вы публикуете свой код, публикуйте пример ввода карты, для которого ваш код находит решение, для которого выполняются следующие условия нетривиальности:
- S и E на расстоянии не менее 10 шагов друг от друга.
- Любой квадрат, который изначально содержит N единиц воды, должен быть окружен границей шириной N, в которой все квадраты
.
(без воды, не S или E)
ПРИМЕР
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
Если вы увеличите количество воды на любой плитке, вышеприведенное становится тривиальным.
Требования
Предположительно, ваша программа столкнется с рядом неудачных попыток, прежде чем найдет решение, если оно есть.
- Ваша программа должна в конечном итоге решить любой разрешимый ввод.
- Я хочу посмотреть, как ты умрешь - твоя программа будет выводить ходы и окончательную карту пути к смерти для каждой неудачной попытки найти решение.
- Если вы столкнулись с выигрышным решением, напечатайте полный вывод для этого и прекратите работу.
- Бегите, пока решение не найдено, но не пытайтесь использовать одно и то же решение дважды - все случаи смерти должны происходить разными путями.
- Используйте этот тестовый вход:
(Требуется по крайней мере один ход, чтобы сбросить кэш воды в некоторой средней точке).
S........
.........
.........
........E
Самый короткий код, который размещен с нетривиальным демонстрационным вводом, который он решает, выигрывает.