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:
|
case MULTIDOKU:
|
||||||
ImGui.inputInt("Taille", sudokuSize);
|
ImGui.inputInt("Taille", sudokuSize);
|
||||||
if (ImGui.button("Résoudre un sudoku")) {
|
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")) {
|
if (ImGui.button("Générer une grille vide")) {
|
||||||
pushSudokuState(SudokuFactory.createBasicSquareMultidoku(sudokuSize.get()), true);
|
pushSudokuState(SudokuFactory.createBasicXShapedMultidoku(sudokuSize.get()), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
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.
|
* @param doku MultiDoku, MultiDoku à résoudre.
|
||||||
* @return boolean, valant true si le MultiDoku est résolu, false sinon.
|
* @return boolean, valant true si le MultiDoku est résolu, false sinon.
|
||||||
*/
|
*/
|
||||||
@@ -129,4 +129,38 @@ public class Solver {
|
|||||||
}
|
}
|
||||||
return false;
|
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;
|
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.
|
* Vide une Cell donnée.
|
||||||
* @param cell Cell, à vider.
|
* @param cell Cell, à vider.
|
||||||
|
|||||||
Reference in New Issue
Block a user