mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
* Add Sum of Squares algorithm implementation * Format code and add Wikipedia URL for Lagrange's theorem * Fixed clang-format issues * Added Mo's Algorithm and DiceThrower recursive algorithms - Mo's Algorithm: Square root decomposition for offline range queries(Imp in CP) - DiceThrower: Recursive backtracking for dice combinations(very imp) - Both algorithms include comprehensive test suites - Formatted with clang-format and i follow contribution guidelines * Fixed checkstyle violation * Fixed SpotBugs issue * Added in PMD exclusions * Improved test coverage for better Codecov scores. * Fixed clang-format issues in test files * Add Mo's Algorithm and DiceThrower algorithms with comprehensive tests * Fixed PartitionProblem.java documentation comment placement
114 lines
3.5 KiB
Java
114 lines
3.5 KiB
Java
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 <a href="https://en.wikipedia.org/wiki/Backtracking">Backtracking Algorithm</a>
|
|
*/
|
|
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<String> 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<String> generateCombinations(String current, int remaining) {
|
|
List<String> 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<String> 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<String> combinations = getDiceCombinations(target);
|
|
|
|
for (String combination : combinations) {
|
|
System.out.println(combination);
|
|
}
|
|
|
|
System.out.println("\nTotal combinations: " + combinations.size());
|
|
}
|
|
}
|