public List<Cell> expandCell(Cell cell) {
		if (cell.isDestination()) {
			// the destination is reached,
			return Collections.emptyList();
		}

		final int x = cell.getX(), y = cell.getY();
		final List<Cell> nextCells = new LinkedList<Cell>();

		// UP
		final int up = y - 1;
		if (y > 0 && maze[up][x] != OBSTACLE) {
			nextCells.add(new Cell(x, up, maze[up][x], Direction.UP));
		}
		// DOWN
		final int down = y + 1;
		if (y < maze.length - 1 && maze[down][x] != OBSTACLE) {
			nextCells.add(new Cell(x, down, maze[down][x], Direction.DOWN));
		}
		// LEFT
		final int left = x - 1;
		if (x > 0 && maze[y][left] != OBSTACLE) {
			nextCells.add(new Cell(left, y, maze[y][left], Direction.LEFT));
		}
		// RIGHT
		final int right = x + 1;
		if (x < maze[y].length - 1 && maze[y][right] != OBSTACLE) {
			nextCells.add(new Cell(right, y, maze[y][right], Direction.RIGHT));
		}

		return nextCells;
	}