Added mos algorithm and dice thrower (#6591)

* 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
This commit is contained in:
Sriram kulkarni
2025-10-08 17:21:44 +05:30
committed by GitHub
parent 596302b80e
commit 959ced9076
5 changed files with 800 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
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());
}
}