+ private String buildStringFromChoiceList(Integer[] newChoiceList) {
+
+ // When we see a choice list shorter than the upper bound, e.g., [3,2] for choices 0,1,2, and 3,
+ // then we have to pad the beginning before we store it, because [3,2] actually means [0,1,3,2]
+ // First, calculate the difference between this choice list and the upper bound
+ // The actual list doesn't include '-1' at the end
+ int actualListLength = newChoiceList.length - 1;
+ int diff = maxUpperBound - actualListLength;
+ StringBuilder sb = new StringBuilder();
+ // Pad the beginning if necessary
+ for (int i = 0; i < diff; i++) {
+ sb.append(i);
+ }
+ // Then continue with the actual choice list
+ // We don't include the '-1' at the end
+ for (int i = 0; i < newChoiceList.length - 1; i++) {
+ sb.append(newChoiceList[i]);
+ }
+ return sb.toString();
+ }
+
+ private void checkAndAddBacktrackList(LinkedList<Integer[]> backtrackChoiceLists, Integer[] newChoiceList) {
+
+ String newChoiceListString = buildStringFromChoiceList(newChoiceList);
+ // Add only if we haven't seen this combination before
+ if (!backtrackSet.contains(newChoiceListString)) {
+ backtrackSet.add(newChoiceListString);
+ backtrackChoiceLists.addLast(newChoiceList);
+ }
+ }
+