Вы можете просто просмотреть сетку в виде графика: каждая ячейка подключена к своим четырем соседям (или меньше, если она на краю), исключая любые блокировки.Используя ваш пример:
1 2 3
1 • • •
2 • x •
3 • • •
у нас есть график (с использованием нотации (строка, столбец)):
(1,1) <-> (1,2)
(2,1) <-> (3,1)
(3,1) <-> (2,3)
(2,3) <-> (3,3)
(3,3) <-> (3,2)
(3,2) <-> (3,1)
(3,1) <-> (2,1)
(2,1) <-> (1,1)
, где все длины ребер равны 1. Теперь вы можете применить стандарт BFS от начального узла до достижения целевого узла, отслеживая, какие узлы вы посещаете.В псевдокоде:
- Пометить все расстояния между ячейками как бесконечные, за исключением начальной ячейки робота с нулевым расстоянием (вы можете сделать это, используя дополнительный 2D-массив, или, возможно, даже на месте, в зависимости от того, как высохранить сетку).
- Инициализировать пустую очередь ячеек Q
- Добавить начальную ячейку робота в Q
- Пока Q не пусто:
- Удаление из очередиследующая ячейка C из Q
- Для каждого неблокирующего соседа N из C (легко определить по сетке):
- Если расстояние N равно бесконечности, отметьте расстояние N как (расстояние C)+ 1, и добавьте N к Q.
- Если N является ячейкой назначения, верните расстояние N.
- На данный момент мы знаем, что естьнет пути от начальной ячейки к ячейке назначения.