Program: 40140
Project: 40140
Buggy source:
/** 
 * Implementation of A
 */
public void findPath(){
  Coordinate startPosition=rover.getStartPosition();
  Coordinate endPosition=rover.getEndPosition();
  List<Node> openList=new ArrayList<Node>();
  List<Node> closedList=new ArrayList<Node>();
  Node startNode=new Node(startPosition);
  Node goalNode=new Node(endPosition);
  startNode.setGScore(0);
  startNode.setFScore(estimateHeuristic(startNode,goalNode));
  startNode.setParent(null);
  openList.add(startNode);
  while (!openList.isEmpty()) {
    Node currentNode=getLowestFScore(openList);
    if (currentIsGoal(currentNode,goalNode)) {
      constructPath(currentNode);
      break;
    }
    openList.remove(currentNode);
    closedList.add(currentNode);
    List<Node> neighborList=getNeighbors(currentNode);
    for (    Node neighbor : neighborList) {
      double tentativeGScore=Double.POSITIVE_INFINITY;
      if (rover.canTraverse(currentNode.getPosition(),neighbor.getPosition())) {
        if (isNodeInList(neighbor,closedList)) {
          continue;
        }
        if (!isNodeInList(neighbor,openList)) {
          openList.add(neighbor);
        }
        tentativeGScore=currentNode.getGScore() + distBetween(currentNode,neighbor);
        if (tentativeGScore >= neighbor.getGScore()) {
          continue;
        }
      }
 else {
        closedList.add(currentNode);
      }
      neighbor.setParent(currentNode);
      neighbor.setGScore(tentativeGScore);
      neighbor.setFScore(neighbor.getGScore() + estimateHeuristic(neighbor,goalNode));
    }
  }
  Collections.reverse(fullPath);
  output=new TerminalOutput(fullPath);
}

Fixed version (ground truth):
/** 
 * Implementation of A
 */
public void findPath(){
  Coordinate startPosition=rover.getStartPosition();
  Coordinate endPosition=rover.getEndPosition();
  List<Node> openList=new ArrayList<Node>();
  List<Node> closedList=new ArrayList<Node>();
  Node startNode=new Node(startPosition);
  Node goalNode=new Node(endPosition);
  startNode.setGScore(0);
  startNode.setFScore(estimateHeuristic(startNode,goalNode));
  startNode.setParent(null);
  openList.add(startNode);
  while (!openList.isEmpty()) {
    Node currentNode=getLowestFScore(openList);
    if (currentIsGoal(currentNode,goalNode)) {
      constructPath(currentNode);
      break;
    }
    openList.remove(currentNode);
    closedList.add(currentNode);
    List<Node> neighborList=getNeighbors(currentNode);
    for (    Node neighbor : neighborList) {
      double tentativeGScore=Double.POSITIVE_INFINITY;
      if (rover.canTraverse(currentNode.getPosition(),neighbor.getPosition())) {
        if (isNodeInList(neighbor,closedList)) {
          continue;
        }
        if (!isNodeInList(neighbor,openList)) {
          openList.add(neighbor);
        }
        tentativeGScore=currentNode.getGScore() + distBetween(currentNode,neighbor);
        if (tentativeGScore >= neighbor.getGScore()) {
          continue;
        }
      }
 else {
        closedList.add(currentNode);
      }
      neighbor.setParent(currentNode);
      neighbor.setGScore(tentativeGScore);
      neighbor.setFScore(neighbor.getGScore() + estimateHeuristic(neighbor,goalNode));
    }
  }
  Collections.reverse(fullPath);
  output=new TerminalOutput(fullPath);
  output=new MapImageOutput(fullPath,map.getMapPath());
}