Remove useless code in pathfinder & support retrieving full path

This commit is contained in:
Nikita Lisitsa 2024-01-29 19:15:57 +03:00
parent 099a09e4d9
commit e6f5fc17a4

View file

@ -57,7 +57,7 @@ namespace psemek::util
void init(Node const & start) void init(Node const & start)
{ {
cost[start] = Cost{}; cost[start] = Cost{};
priority[start] = cost[start] + heuristic(start); priority[start] = heuristic(start);
queue.insert(start); queue.insert(start);
} }
@ -100,14 +100,14 @@ namespace psemek::util
return cost.contains(end); return cost.contains(end);
} }
// Doesn't return the starting node! // Doesn't include the starting node
template <typename Iterator> template <typename Iterator, typename IsStart>
Iterator path(Node const & start, Node const & end, Iterator it) const Iterator path(IsStart const & is_start, Node const & end, Iterator it) const
{ {
Node node = end; Node node = end;
while (true) while (true)
{ {
if (node == start) if (is_start(node))
break; break;
*it++ = node; *it++ = node;
node = previous.at(node); node = previous.at(node);
@ -115,6 +115,29 @@ namespace psemek::util
return it; return it;
} }
// Includes the starting node
template <typename Iterator, typename IsStart>
Iterator path_full(IsStart const & is_start, Node const & end, Iterator it) const
{
Node node = end;
while (true)
{
*it++ = node;
if (is_start(node))
break;
node = previous.at(node);
}
return it;
}
// Doesn't include the starting node
template <typename Iterator>
Iterator path(Node const & start, Node const & end, Iterator it) const
{
return path([start](Node const & node){ return node == start; }, end, it);
}
// Doesn't include the starting node
std::deque<Node> path(Node const & start, Node const & end) const std::deque<Node> path(Node const & start, Node const & end) const
{ {
std::deque<Node> result; std::deque<Node> result;