Vector<Integer> proposePath(int fromCellId, int toCellId) {
        int guessNumCells = (int) (estimateDistanceInCells(fromCellId, toCellId) * 1.25 + 1);
        Vector<Integer> result = new Vector<>(guessNumCells);
        int currentCellId = fromCellId;
        result.add(currentCellId);
        while (currentCellId != toCellId) {
            if (estimateDistanceInCells(currentCellId, toCellId) == 1) {
                currentCellId = toCellId;
            } else {
                Vector<Integer> neighbors = getNeighbors(currentCellId);
                Vector<Double> degreesToGo = new Vector<>(neighbors.size());
                for (int i=0; i<neighbors.size(); i++) {
                    int neighborCellId = neighbors.get(i);
                    double distanceInDegrees = getDistanceInDegrees(neighborCellId, toCellId);
                    degreesToGo.add(distanceInDegrees);
                }
                int bestNeighborId = neighbors.get(0);
                double shortestDistance = degreesToGo.get(0);
                for (int i=1; i<neighbors.size(); i++) {
                    if (degreesToGo.get(i) < shortestDistance) {
                        bestNeighborId = neighbors.get(i);
                        shortestDistance = degreesToGo.get(i);
                    }
                }
                currentCellId = bestNeighborId;
            }
            result.add(currentCellId);
        }
        result.trimToSize();
        return result;
    }