Ледяные лабиринты были одной из моих любимых игр Покемонов с момента их дебюта в Pokémon Gold и Silver. Ваша задача будет сделать программу, которая решает эти типы проблем.
Ледяные лабиринты в основном состоят, как следует из названия, изо льда. Как только игрок движется в направлении на льду, он будет продолжать двигаться в этом направлении, пока не столкнется с каким-либо препятствием. Существует также почва, которая может свободно перемещаться и остановит любого игрока, движущегося по ней. Последнее препятствие - камень. Камень не может занимать то же пространство, что и игрок, и если игрок попытается войти в него, он остановится, прежде чем сможет.
Вы получите двумерный контейнер значений, такой как список списков или строку, разделенную новыми строками, содержащую 3 различных значения для каждого из 3 типов напольных покрытий (Ice, Soil и Stone). Вы также получите две пары (или другие эквивалентные два контейнера значений), которые указывают начальную и целевую координаты в лабиринте. Это может быть ноль или один индекс.
Вы должны вывести список ходов (4 различных значения с биекцией на N, E, S, W), которые позволят игроку достигнуть конца при выполнении.
Вход всегда будет иметь замкнутый периметр камня вокруг лабиринта, поэтому вам не придется беспокоиться о выходе игрока из лабиринта.
Это код-гольф, поэтому побеждает меньше всего байтов
Тестовые случаи
Здесь .
будет изображать лед, ~
будет представлять почву, и O
будет представлять собой камень. Координаты 1 проиндексированы. Каждая буква в решении представляет направление, начинающееся с этой буквы (например, N
= Север)
вход
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Выход
N
вход
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Выход
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
вход
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Выход
E,S,S,W,N,E,N
вход
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Выход
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
источник
Ответы:
Mathematica, 247 байтов
С переносами строк:
Моя непосредственная идея состояла в том, чтобы представить позиции льда и почвы в виде узлов на графике с направленными краями, соответствующими законным движениям, а затем использовать
FindPath
. Кто-то может подумать, что определение юридических шагов будет легкой частью, а поиск решения будет сложной. Для меня это было наоборот. Откройте для предложений о том, как вычислить края.Первый аргумент
#
- это двумерный массив,0
представляющий лед,1
почву и2
камень.Второй аргумент
#2
и третий аргумент#3
являются начальной и конечной точками, соответственно, в форме{row,column}
.
является 3 байта частного использования символов ,U+F4A1
представляющий\[Function]
.объяснение
Определяет функцию,
p
которая принимает списокx
формы{row,column}
и результатов#[[row,column]]
; то есть значение лед / почва / камень по этой координате.Определяет функцию,
m
которая принимает начальную позициюc
и вектор направленияv
и рекурсивно определяет, где вы окажетесь. Еслиc+v
это лед, то мы продолжаем скользить от этой точки, поэтому она возвращаетсяm[c+v,v]
. Еслиc+v
это почва, то мы идемc+v
и останавливаемся. В противном случае (еслиc+v
это камень или за пределы), вы не двигаетесь. Обратите внимание, что это предназначено только для положения на льду или почве.Определяет список
g
позиций льда и почвы (p
значение меньше, чем2
).Определяет функцию ,
a
которая принимает стартовую позициюc
и возвращают результаты перемещения в{1,0}
,{-1,0}
,{0,1}
и{0,-1}
направлениях. Там может быть некоторая избыточность. Опять же, это предполагает, чтоc
соответствует льду или почве.Определяет список
e
направленных ребер, представляющих допустимые ходы. Для каждой позиции#
вg
, вычислите таблицу ребер#->c
для каждогоc
дюймаa@#
. Затем, поскольку мы получим подсписок для каждой позиции#
, я выравниваю первый уровень. Там может быть несколько петель и несколько ребер.Graph[e]
это график, где узлами являются допустимые позиции (лед или почва), а края представляют собой законные движения (возможно, натыкаясь на камень и не двигаясь). Затем мы используем,FindPath
чтобы найти путь от#2
к#3
представленному в виде списка узлов. ПосколькуFindPath
для поиска более одного пути могут использоваться дополнительные аргументы, результатом будет список, содержащий один путь, поэтому я использую первый элемент[[1]]
. Затем я беру последовательныеDifferences
координаты иNormalize
их. Таким образом, вверх есть{-1,0}
, вниз есть{1,0}
, справа есть,{0,1}
а слева есть{0,-1}
.Контрольные примеры
источник
JavaScript (ES6) 180
183Используя BFS , как я сделал, чтобы решить эту связанную проблему
Входные данные
Карта лабиринта представляет собой многострочную строку, использующую
O
или0
для камня,8
для почвы и любую ненулевую цифру меньше 8 для льда (7
выглядит хорошо).Начальная и конечная позиции начинаются с нуля.
Выходные данные
Список смещений, где -1 равно
W
1E
, отрицательное меньше -1N
и положительное больше 1S
Меньше гольфа
Тестовое задание
источник