feat : humanSolve
All checks were successful
Linux arm64 / Build (push) Successful in 50s

This commit is contained in:
Melvyn
2025-01-29 09:55:14 +01:00
parent c7217894b2
commit cd45d1c22c
4 changed files with 53 additions and 3 deletions

1
app/save/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
save-*.json

View File

@@ -79,10 +79,10 @@ public class SoloMenu extends BaseView {
case MULTIDOKU:
ImGui.inputInt("Taille", sudokuSize);
if (ImGui.button("Résoudre un sudoku")) {
pushSudokuState(SudokuFactory.createBasicSquareMultidoku(sudokuSize.get()), false);
pushSudokuState(SudokuFactory.createBasicXShapedMultidoku(sudokuSize.get()), false);
}
if (ImGui.button("Générer une grille vide")) {
pushSudokuState(SudokuFactory.createBasicSquareMultidoku(sudokuSize.get()), true);
pushSudokuState(SudokuFactory.createBasicXShapedMultidoku(sudokuSize.get()), true);
}
default:

View File

@@ -95,7 +95,7 @@ public class Solver {
}
/**
* Résout le MultiDoku passé en paramètre.
* Résout le MultiDoku passé en paramètre, avec backtracking.
* @param doku MultiDoku, MultiDoku à résoudre.
* @return boolean, valant true si le MultiDoku est résolu, false sinon.
*/
@@ -129,4 +129,38 @@ public class Solver {
}
return false;
}
/**
* Résout le MultiDoku passé en paramètre, sans backtracking.
* @param doku MultiDoku, MultiDoku à résoudre.
* @return boolean, valant true si le MultiDoku est résolu, false sinon.
*/
public static boolean humanSolve(MultiDoku doku) {
if (Thread.interrupted())
throw new CancellationException("User wants to stop the solver");
List<Cell> cellsToFill = doku.getEmptyCells();
while (!cellsToFill.isEmpty()) {
boolean blocked = true;
for (Cell cellToFill : cellsToFill) {
List<Integer> possibleSymbols = doku.getPossibleSymbolsOfCell(cellToFill);
if (possibleSymbols.size() != 1) {
continue;
}
cellToFill.setSymbolIndex(possibleSymbols.getFirst());
cellsToFill.remove(cellToFill);
blocked = false;
break;
}
if (blocked) {
break;
}
}
return doku.isValid();
}
}

View File

@@ -166,6 +166,21 @@ public class MultiDoku {
return result;
}
/**
* Renvoie la liste des Cells vides du MultiDoku.
* @return List<Cell>, vide si aucune Cell ne l'est.
*/
public List<Cell> getEmptyCells() {
List<Cell> result = new ArrayList<>();
for (Cell cell : this.getCells()){
if (cell.isEmpty()) {
result.add(cell);
}
}
return result;
}
/**
* Vide une Cell donnée.
* @param cell Cell, à vider.