# turingschool/data_structures_and_algorithms

Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.

## Pathfinding with A*

The A* algorithm is a way of finding a path between two points of a graph or map.

### An Example Application

Imagine you have a character `C` who wants to move to the target `T`. Blank spaces on the map are traversable, but obstructions are marked as `O`:

``````     T  |
OOOOO |
|
OOOO    |
C       |
``````

How can `C` move to `T` in the fewest steps? The A* algorithm helps find a path.

### The Algorithm

In pseudocode:

``````function A*(start,goal)
closedset := the empty set    // The set of nodes already evaluated.
openset := {start}    // The set of tentative nodes to be evaluated, initially containing the start node
came_from := the empty map    // The map of navigated nodes.

g_score[start] := 0    // Cost from start along best known path.
// Estimated total cost from start to goal through y.
f_score[start] := g_score[start] + heuristic_cost_estimate(start, goal)

while openset is not empty
current := the node in openset having the lowest f_score[] value
if current = goal
return reconstruct_path(came_from, goal)

remove current from openset
for each neighbor in neighbor_nodes(current)
tentative_g_score := g_score[current] + dist_between(current,neighbor)
tentative_f_score := tentative_g_score + heuristic_cost_estimate(neighbor, goal)
if neighbor in closedset and tentative_f_score >= f_score[neighbor]
continue

if neighbor not in openset or tentative_f_score < f_score[neighbor]
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := tentative_f_score
if neighbor not in openset