Ответ 1
Я бы представил сетку как список списков, введите [[Bool]]
. И я бы определил функцию, чтобы узнать, заполнен ли элемент сетки:
type Grid = [[Bool]]
isFullAt :: Grid -> (Int, Int) -> Bool -- returns True for anything off-grid
Тогда я бы определил функцию для поиска соседей:
neighbors :: (Int, Int) -> [(Int, Int)]
Чтобы найти неполные соседи point
, вы можете фильтровать с помощью filter (not . isFullAt) $ neighbors point
.
В этот момент я бы определил две структуры данных:
- Сопоставьте каждую точку с
Maybe Cost
- Хранить все точки с известной стоимостью в куче
Инициализируйте только начальный квадрат A в куче, с нулевой стоимостью.
Затем выполните следующие шаги:
- Удалите квадрат минимальной стоимости из кучи.
- Если это еще не на конечном карте, добавьте его и его стоимость
c
и добавьте все неполные соседи в кучу со стоимостьюc+1
.
Когда куча пуста, у вас будут затраты на все доступные точки и вы можете найти B на конечной карте. (Этот алгоритм можно назвать "алгоритмом Дейкстры", я забыл.)
Вы можете найти конечные отображения в Data.Map
. Я предполагаю, что там где-то в обширной библиотеке есть куча (ака приоритетная очередь), но я не знаю, где.
Надеюсь, этого достаточно, чтобы вы начали.