This commit is contained in:
1
app/save/.gitignore
vendored
Normal file
1
app/save/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
save-*.json
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user