private ArrayList<Point> aStarSearch(Point location, Point destination, Campus campus)
	{
    	int traveled = 0;
    	PriorityQueue<CPoint> frontier = new PriorityQueue<CPoint>(); 
    	ArrayList<Point> solution = new ArrayList<Point>();
    	ArrayList<Point> observations;
    	HashMap<Integer,Point> explored = new HashMap<Integer,Point>();
    	
    	Point start = location;
    	Point end = destination;
    	explored.put(start.hashCode(), start);
    	Point current = start;
    	solution.add(start);
    	
    	
		while (!(solution.get(0).equals(start) && solution.get(solution.size()-1).equals(end)))
    	{
    		observations = campus.getAdjacent(current);
    		
    		if (observations.size() == 0)
    		{	System.out.println("Impossible destination.");
    			return null;
    		}
    		else if (observations.size() >= 1)
    		{	
    			for (Point p : observations)
    			{	if (explored.get(p.hashCode()) == null)
    				{	double heuristic = Math.pow((Math.pow((end.x-p.x), 2) + Math.pow((end.y-p.y), 2)),.5);
    					frontier.add(new CPoint(p, heuristic, traveled+1));
    					explored.put(p.hashCode(), p);
    					
    					if (p.equals(end))
    					{	solution.add(p);
    						return cleanSolution(solution, campus, true);
    					}
    				}	
    			}
    			
    			if (frontier.size() == 0)
    			{	System.out.println("Maze is not solvable");
    				return null;
    			}
    			
    			// set variables for next iteration
    			CPoint next = frontier.remove();	// best valued move  				
    			traveled = next.getTraveled();
    			current = next.getPoint();
    			solution.add(current);
    		}
    	}
		
		return cleanSolution(solution, campus, true);
    }