private static Set<GridPacking<CatCage>> solve_aux(Sequence<CatCage> cagePlacementSequence, List<CatCage> catCageList, int rowCount, int columnCount)
	{
		assert isViable(cagePlacementSequence, rowCount, columnCount) : String.format("cagePlacementSequence is not viable! : cagePlacementSequence =\n %s", new GridPackingImpl_Nunez<CatCage>(rowCount, columnCount, SequenceUtils.asList(cagePlacementSequence)));

		Set<GridPacking<CatCage>> solutionWithPrefixSet = new HashSet<GridPacking<CatCage>>();

		if (catCageList.size() == 0)
		{
			solutionWithPrefixSet.add(new GridPackingImpl_Nunez<CatCage>(rowCount, columnCount, SequenceUtils.asList(cagePlacementSequence)));
			return solutionWithPrefixSet;
		}

		int index = 0;
		for (CatCage catCage : catCageList)
		{
			System.out.println("Current CatCageList: " + Arrays.toString(catCageList.toArray()));
			System.out.println("Current Cage: " + catCage.toString());
			System.out.println("Sequence Size: " + cagePlacementSequence.size() + "\n");

			if (canAdd(catCage, cagePlacementSequence, rowCount, columnCount))
			{
				cagePlacementSequence.extend(catCage);
				List<CatCage> newCatCageList = new ArrayList<CatCage>(catCageList);
				newCatCageList.remove(index);
				solutionWithPrefixSet.addAll(solve_aux(cagePlacementSequence, newCatCageList, rowCount, columnCount));
				cagePlacementSequence.retract();
			}

			CatCage testCage = CatCageUtils_Nunez.rotate90(catCage);
			if (canAdd(testCage, cagePlacementSequence, rowCount, columnCount))
			{
				cagePlacementSequence.extend(testCage);
				List<CatCage> newCatCageList = new ArrayList<CatCage>(catCageList);
				newCatCageList.remove(index);
				solutionWithPrefixSet.addAll(solve_aux(cagePlacementSequence, newCatCageList, rowCount, columnCount));
				cagePlacementSequence.retract();
			}

			testCage = CatCageUtils_Nunez.rotate180(catCage);
			if (canAdd(testCage, cagePlacementSequence, rowCount, columnCount))
			{
				cagePlacementSequence.extend(testCage);
				List<CatCage> newCatCageList = new ArrayList<CatCage>(catCageList);
				newCatCageList.remove(index);
				solutionWithPrefixSet.addAll(solve_aux(cagePlacementSequence, newCatCageList, rowCount, columnCount));
				cagePlacementSequence.retract();
			}

			testCage = CatCageUtils_Nunez.rotate270(catCage);
			if (canAdd(testCage, cagePlacementSequence, rowCount, columnCount))
			{
				cagePlacementSequence.extend(testCage);
				List<CatCage> newCatCageList = new ArrayList<CatCage>(catCageList);
				newCatCageList.remove(index);
				solutionWithPrefixSet.addAll(solve_aux(cagePlacementSequence, newCatCageList, rowCount, columnCount));
				cagePlacementSequence.retract();
			}
			++index;
		}
		return solutionWithPrefixSet;
	}