package com.thealgorithms.recursion;
import java.util.ArrayList;
import java.util.List;
/**
* DiceThrower - Generates all possible dice roll combinations that sum to a target
*
* This algorithm uses recursive backtracking to find all combinations of dice rolls
* (faces 1-6) that sum to a given target value.
*
* Example: If target = 4, possible combinations include:
* - "1111" (1+1+1+1 = 4)
* - "13" (1+3 = 4)
* - "22" (2+2 = 4)
* - "4" (4 = 4)
*
* @author BEASTSHRIRAM
* @see Backtracking Algorithm
*/
public final class DiceThrower {
private DiceThrower() {
// Utility class
}
/**
* Returns all possible dice roll combinations that sum to the target
*
* @param target the target sum to achieve with dice rolls
* @return list of all possible combinations as strings
*/
public static List getDiceCombinations(int target) {
if (target < 0) {
throw new IllegalArgumentException("Target must be non-negative");
}
return generateCombinations("", target);
}
/**
* Prints all possible dice roll combinations that sum to the target
*
* @param target the target sum to achieve with dice rolls
*/
public static void printDiceCombinations(int target) {
if (target < 0) {
throw new IllegalArgumentException("Target must be non-negative");
}
printCombinations("", target);
}
/**
* Recursive helper method to generate all combinations
*
* @param current the current combination being built
* @param remaining the remaining sum needed
* @return list of all combinations from this state
*/
private static List generateCombinations(String current, int remaining) {
List combinations = new ArrayList<>();
// Base case: if remaining sum is 0, we found a valid combination
if (remaining == 0) {
combinations.add(current);
return combinations;
}
// Try all possible dice faces (1-6), but not more than remaining sum
for (int face = 1; face <= 6 && face <= remaining; face++) {
List subCombinations = generateCombinations(current + face, remaining - face);
combinations.addAll(subCombinations);
}
return combinations;
}
/**
* Recursive helper method to print all combinations
*
* @param current the current combination being built
* @param remaining the remaining sum needed
*/
private static void printCombinations(String current, int remaining) {
// Base case: if remaining sum is 0, we found a valid combination
if (remaining == 0) {
System.out.println(current);
return;
}
// Try all possible dice faces (1-6), but not more than remaining sum
for (int face = 1; face <= 6 && face <= remaining; face++) {
printCombinations(current + face, remaining - face);
}
}
/**
* Demo method to show usage
*
* @param args command line arguments
*/
public static void main(String[] args) {
int target = 4;
System.out.println("All dice combinations that sum to " + target + ":");
List combinations = getDiceCombinations(target);
for (String combination : combinations) {
System.out.println(combination);
}
System.out.println("\nTotal combinations: " + combinations.size());
}
}