def a_star(n, start, goal, obstacles): priority = lambda p: len(p) + puz.manhattan_dist(p[-1], goal) visited = set() frontier = list() q.heappush(frontier, (priority([start]), [start])) while frontier: _, path = q.heappop(frontier) if path[-1] == goal: return path if not path[-1] in visited: visited.add(path[-1]) walkable_neighbors = [nb for nb in puz.direct_neighbors(path[-1]) if puz.on_field((n, n), nb) and nb not in obstacles] # TODO for p in [path + [n] for n in walkable_neighbors]: q.heappush(frontier, (priority(p), p)) return None
def test_manhattan_dist(self): self.assertEqual(p.manhattan_dist((0, 0), (1, 1)), 2)