From cd45d1c22cd2595a60e06fa4cd8b329ddcf28e54 Mon Sep 17 00:00:00 2001 From: Melvyn Date: Wed, 29 Jan 2025 09:55:14 +0100 Subject: [PATCH] feat : humanSolve --- app/save/.gitignore | 1 + app/src/main/java/gui/menu/SoloMenu.java | 4 +-- app/src/main/java/sudoku/solver/Solver.java | 36 ++++++++++++++++++- .../main/java/sudoku/structure/MultiDoku.java | 15 ++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 app/save/.gitignore diff --git a/app/save/.gitignore b/app/save/.gitignore new file mode 100644 index 0000000..fdc2710 --- /dev/null +++ b/app/save/.gitignore @@ -0,0 +1 @@ +save-*.json \ No newline at end of file diff --git a/app/src/main/java/gui/menu/SoloMenu.java b/app/src/main/java/gui/menu/SoloMenu.java index 6eba3b5..e8c6d2a 100644 --- a/app/src/main/java/gui/menu/SoloMenu.java +++ b/app/src/main/java/gui/menu/SoloMenu.java @@ -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: diff --git a/app/src/main/java/sudoku/solver/Solver.java b/app/src/main/java/sudoku/solver/Solver.java index 63b8d3d..3dd991a 100644 --- a/app/src/main/java/sudoku/solver/Solver.java +++ b/app/src/main/java/sudoku/solver/Solver.java @@ -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 cellsToFill = doku.getEmptyCells(); + + while (!cellsToFill.isEmpty()) { + boolean blocked = true; + for (Cell cellToFill : cellsToFill) { + + List 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(); + } } diff --git a/app/src/main/java/sudoku/structure/MultiDoku.java b/app/src/main/java/sudoku/structure/MultiDoku.java index 052a808..e000664 100644 --- a/app/src/main/java/sudoku/structure/MultiDoku.java +++ b/app/src/main/java/sudoku/structure/MultiDoku.java @@ -166,6 +166,21 @@ public class MultiDoku { return result; } + /** + * Renvoie la liste des Cells vides du MultiDoku. + * @return List, vide si aucune Cell ne l'est. + */ + public List getEmptyCells() { + List 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.