We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.

This lesson's interactive features are locked, please to keep using them

A* Search Review

Use this implementation of A* to answer the question:

def heuristic(next: "Tile", dest: "Tile") -> int:
    h: int = abs(next.x - dest.x) + abs(next.y - dest.y)
    return h


def a_star_search(muddy_grid: "TrafficGrid", src: "Tile", dest: "Tile") -> list["Tile"]:
    queue: PriorityQueue = PriorityQueue()
    queue.push(0, src)
    predecessors: dict["Tile", "Tile" | None] = {src: None}
    costs: dict["Tile", int] = {src: 0}
    visited: set["Tile"] = set()

    while not queue.empty():
        current: "Tile" = queue.pop()
        if current == dest:
            break
        if current in visited:
            continue
        visited.add(current)
        for next in muddy_grid.neighbors(current):
            next_cost_so_far: int = costs[current] + next.cost()
            if next not in costs or next_cost_so_far < costs[next]:
                costs[next] = next_cost_so_far
                priority: int = next_cost_so_far + heuristic(next, dest)
                queue.push(priority, next)
                predecessors[next] = current

    path: list["Tile"] = []
    pred: "Tile" | None = dest
    while pred is not None:
        path.append(pred)
        pred = predecessors.get(pred, None)
    path.reverse()
    return path