Implement A* graph search. A* takes a heuristic function as an argument. Heuristics
take two arguments: a state in the search problem (the main argument), and the
problem itself (for reference information).
Note that you may need to change data structures like priority queue depending on
your implementation. For example, if the priority queue is a queue of custom class
objects, you might need to change the update function. However, it is not required
that you implement the algorithm this way.
b) Comment on Admissibility vs. Consistency.