Ви подорожній, що перетинає пустелю між двома містами. Ви не можете нести достатню кількість води, щоб пройти, не зупинившись. Це варіація класичної головоломки.
Правила
Пустеля виглядає так: сітка 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, ви помрете .
Вхід і вихід
Ваша програма отримає стартову карту довільного розміру на 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
Найкоротший код, який розміщується з нетривіальним демонстраційним вкладом, який він вирішує, виграє.