Merge branch 'master' of git.ale-pri.com:Ryuk/Sudoku
Some checks failed
Linux arm64 / Build (push) Has been cancelled

This commit is contained in:
2025-01-28 09:25:27 +01:00
9 changed files with 159 additions and 53 deletions

View File

@@ -4,14 +4,17 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import sudoku.constraint.BlockConstraint;
import sudoku.constraint.ColumnConstraint;
import sudoku.constraint.IConstraint;
import sudoku.constraint.LineConstraint;
import sudoku.solver.Solver;
public class SudokuFactory {
private static final Random random = new Random();
public static List<IConstraint> DEFAULT_CONSTRAINTS = Arrays.asList(new BlockConstraint(), new LineConstraint(), new ColumnConstraint());
private static List<Cell> initCells(int size) {
@@ -66,6 +69,37 @@ public class SudokuFactory {
});
}
public static boolean newDokuFromFilledOne (MultiDoku doku, int difficulty) throws Exception {
if (difficulty > doku.getCells().size()) {
throw new Exception();
}
if (difficulty == 0) {
return true;
}
List<Cell> cellsThatCanBeEmptied = doku.getFilledCells();
while (!cellsThatCanBeEmptied.isEmpty()) {
int index = random.nextInt(cellsThatCanBeEmptied.size());
Cell cellToEmpty = cellsThatCanBeEmptied.get(index);
int oldSymbol = cellToEmpty.empty();
if (Solver.countSolution(doku) == 1) {
if (newDokuFromFilledOne(doku, --difficulty)) {
return true;
}
}
cellToEmpty.setSymbolIndex(oldSymbol);
cellsThatCanBeEmptied.remove(cellToEmpty);
}
return false;
}
private static Sudoku createRectangleSudoku(int width, int height) {
int symbolCount = width * height;
List<Cell> cases = initCells(symbolCount);