A* finds shortest paths faster than Dijkstra by using a heuristic: an estimate of the remaining distance that never overestimates it.
Implement a_star(grid, start, goal):
grid is a list of strings, where "." is open and "#" is a wall. Positions are (row, col).start to goal inclusive, or None if unreachable (including when start or goal is a wall).Also implement path_length(path), the number of moves (len(path) - 1).