public LinkedList<LinkedList<Direction>> spreadBestPaths() throws CloneNotSupportedException {
		LinkedList<LinkedList<Direction>> bestPaths = new LinkedList<LinkedList<Direction>>();
		SokobanMap temMap = (SokobanMap) this.clone();
		LinkedList<Position> toSpread = new LinkedList<Position>();
		toSpread.add(manPosition);
		temMap.setValue(manPosition, SokobanMap.PATH_START_NUM);
		Position current = null;
		while ((current = toSpread.poll()) != null) {
			for (Direction d : Direction.values()) {
				Position neighbor = temMap.getNeighbor(current, d);
				if (temMap.getValue(neighbor) == SokobanMap.EMPTY_CHAR
						|| temMap.getValue(neighbor) == SokobanMap.AIM_CHAR) {
					temMap.setValue(neighbor, (char) (temMap.getValue(current) + 1));
					toSpread.add(neighbor);
				} else if (temMap.getValue(neighbor) == SokobanMap.BOX_CHAR
						|| temMap.getValue(neighbor) == SokobanMap.BOX_AIM_CHAR) {
					if (temMap.canPush(neighbor, d) && false == temMap.deadBox(temMap.getNeighbor(neighbor, d))) {
						LinkedList<Direction> bestPath = temMap.backBestPath(current, d);
						bestPaths.add(bestPath);
					}
				}
			}
		}
		return bestPaths;
	}