protected static Queue<Cell> findPath(Cell inpSource, Cell inpDestination) {
        Queue<Cell> q = new LinkedList<Cell>();
        Set<Cell> used = new HashSet<Cell>();
        Map<Cell, Cell> prev = new HashMap<Cell, Cell>();
        q.offer(inpSource);
        used.add(inpSource);
        prev.put(inpSource, null);
        while (!q.isEmpty()) {
            Cell v = q.poll();
            for (Cell neighbor : v.getNeighbours()) {
                if (!used.contains(neighbor) && (neighbor.isEmpty() || neighbor == inpDestination)) {
                    used.add(neighbor);
                    q.offer(neighbor);
                    prev.put(neighbor, v);
                }
            }
        }
        if (!used.contains(inpDestination)) {
            return null;
        } else {
            LinkedList<Cell> path = new LinkedList<Cell>();
            for (Cell v = inpDestination; prev.get(v) != null; v = prev.get(v)) {
                path.add(v);
            }
            Collections.reverse(path);
            return path;
        }
    }