Вызов
Учитывая размер сетки, положение препятствий, положение игрока и положение цели, ваша задача состоит в том, чтобы найти путь для игрока, чтобы добраться до цели и избежать препятствий одновременно (при необходимости).
вход
- N : размер сетки
N x N
- P : позиция игрока
[playerposx, playerposy]
- T : позиция цели
[targetposx, targetposy]
- O : позиции препятствий
[[x1, y1], [x2, y2],...,[xn, yn]]
Выход
Путь : путь, по которому игрок может добраться до цели[[x1, y1], [x2, y2],...,[xn, yn]]
правила
- Точка
[0,0]
находится в верхнем левом углу сетки. - Положение игрока всегда будет на левой стороне сетки.
- Положение цели всегда будет на правой стороне сетки.
- Сетка всегда будет иметь хотя бы одно препятствие.
- Вы можете предположить, что никакое препятствие не перекрывает игрока или целевую позицию.
- Вам не обязательно нужно найти минимальный путь.
- Игрок может двигаться только влево, вправо, сверху и снизу не по диагонали.
- Вы можете принять вход любым удобным способом.
- Вы можете предположить, что путь для игрока, чтобы добраться до цели, всегда будет существовать.
- Очевидно, что для каждого ввода существует несколько допустимых путей, выберите один.
- Предположим,
N > 2
что сетка будет как минимум3 x 3
.
Примеры
Входной сигнал: 9
, [6, 0]
, [3, 8]
, [[0, 5], [2, 2], [6, 4], [8, 2], [8, 7]]
Возможный выход:[[6, 0], [6, 1], [6, 2], [6, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [4, 8], [3, 8]]
Входной сигнал: 6
, [1, 0]
, [3, 5]
, [[1, 2], [2, 5], [5, 1]]
Возможный выход:[[1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [2, 4], [3, 4], [3, 5]]
Заметка
Обратите внимание, что X
для строк и Y
столбцов. Не путайте их с координатами на изображении.
редактировать
Как указал @digEmAll, из-за правил #2
и #3
, playerY = 0
и targetY = N-1
. Таким образом, если вы хотите, вы можете взять только в качестве входных данных playerX
и и targetX
(если это делает ваш код короче).
источник
Ответы:
JavaScript (ES6), 135 байт
Принимает ввод как
(width, [target_x, target_y], obstacles)(source_x, source_y)
, где препятствия - это массив строк в"X,Y"
формате.Возвращает массив строк в
"X,Y"
формате.Попробуйте онлайн!
комментарии
источник
R 227 байт
Попробуйте онлайн!
Не очень короткий, и определенно не дает кратчайший путь (например, проверьте первый пример).
Он в основном выполняет рекурсивный поиск в глубину и останавливается, как только цель достигнута, печатая путь.
Спасибо JayCe за улучшение форматирования вывода
источник
x1 y1 x2 y2 ... xn yn
: Dwrite(t(mx),1,N)
вместоprint
ING :)Python 2 ,
151149 байтПопробуйте онлайн!
источник
Haskell ,
133131130 байтПопробуйте онлайн! (с несколькими тестами)
Функция,
!
принимающая в качестве входных данныхn :: Int
размер сеткиp :: [Int]
позиция игрока в списке[xp, yp]
o :: [[Int]]
позиция препятствий в виде списка[[x1, y1], [x2, y2], ...]
t :: [[[Int]]]
(неявная) позиция цели в виде списка[[[xt, yt]]]
(тройной список просто для удобства)и возвращает правильный путь в виде списка
[[xp, yp], [x1, y1], ..., [xt, yt]]
.В качестве бонуса он находит (один из) кратчайший путь и работает на позицию любого игрока и цели. С другой стороны, это очень неэффективно (но приведенные примеры выполняются за разумное время).
объяснение
iterate
[[xt, yt]]
По-видимому, неясное выражение
[id, map (+ 1)] <*> [[x - 1,y], [x, y - 1]]
- это просто «версия для гольфа» (-1 байт)[[x + 1, y], [x, y + 1], [x - 1, y], [x, y - 1]]
.источник
Сетчатка 0.8.2 , 229 байт
Попробуйте онлайн! Не уверен, подходит ли формат ввода / вывода. Объяснение:
Дублируйте каждую клетку. Левая копия используется как временная рабочая зона.
Пометить начало лабиринта как посещенное.
Отметьте конец лабиринта как пустой.
Пока существуют доступные рабочие ячейки, наведите их на соседние ранее посещенные ячейки.
Проследите путь от выхода до начала, используя рабочие ячейки в качестве ориентира.
Удалить рабочие ячейки.
источник
JavaScript, 450 байт
Принимает вход как
(n, {playerx, playery}, {targetx, targety}, [{obstaclex, obstacley}])
. Возвращает массив{hopx, hopy}
.Вот бесподобная версия моего беспорядка:
источник