From 78bdefebe5c87ad610256d2ec83440283b9b4f2d Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Feb 2025 22:54:02 +0100 Subject: [PATCH] feat: add history --- .../sudoku/solver/BacktrackingSolver.java | 6 ++--- .../main/java/sudoku/solver/HumanSolver.java | 5 ++-- .../main/java/sudoku/solver/MixedSolver.java | 11 +++++---- .../main/java/sudoku/solver/RandomSolver.java | 8 ++++--- app/src/main/java/sudoku/solver/Solver.java | 16 ++++++++++--- .../main/java/sudoku/solver/SolverStep.java | 23 +++++++++++++++++++ 6 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/sudoku/solver/SolverStep.java diff --git a/app/src/main/java/sudoku/solver/BacktrackingSolver.java b/app/src/main/java/sudoku/solver/BacktrackingSolver.java index 750a8aa..f940937 100644 --- a/app/src/main/java/sudoku/solver/BacktrackingSolver.java +++ b/app/src/main/java/sudoku/solver/BacktrackingSolver.java @@ -15,7 +15,7 @@ public class BacktrackingSolver implements Solver { * @return boolean, valant true si le MultiDoku est résolu, false sinon. */ @Override - public boolean solve(MultiDoku doku) { + public boolean solve(MultiDoku doku, List steps) { if (Thread.interrupted()) throw new CancellationException("User wants to stop the solver"); @@ -34,14 +34,14 @@ public class BacktrackingSolver implements Solver { } for (int symbol : possibleSymbols) { - cellToFill.setSymbolIndex(symbol); + addStep(cellToFill, steps); if (this.solve(doku)) { return true; } else { cellToFill.setSymbolIndex(Cell.NOSYMBOL); + addStep(cellToFill, steps); } - } return false; } diff --git a/app/src/main/java/sudoku/solver/HumanSolver.java b/app/src/main/java/sudoku/solver/HumanSolver.java index e649378..adb1d37 100644 --- a/app/src/main/java/sudoku/solver/HumanSolver.java +++ b/app/src/main/java/sudoku/solver/HumanSolver.java @@ -19,7 +19,7 @@ public class HumanSolver implements Solver { * @return boolean, valant true si le MultiDoku est résolu, false sinon. */ @Override - public boolean solve(MultiDoku doku) { + public boolean solve(MultiDoku doku, List steps) { if (Thread.interrupted()) throw new CancellationException("User wants to stop the solver"); @@ -28,7 +28,7 @@ public class HumanSolver implements Solver { '\n' + SudokuPrinter.toStringRectangleSudoku(sudoku, sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getBlockWidth(), sudoku.getBlockWidth() == 0 ? sudoku.getSize() : sudoku.getSize() / sudoku.getBlockWidth(), - Symbols.Numbers)); + Symbols.Numbers)); if (doku.isSolved()) { return true; @@ -47,6 +47,7 @@ public class HumanSolver implements Solver { } cellToFill.setSymbolIndex(possibleSymbols.getFirst()); + addStep(cellToFill, steps); return this.solve(doku); } diff --git a/app/src/main/java/sudoku/solver/MixedSolver.java b/app/src/main/java/sudoku/solver/MixedSolver.java index 0ec3e2f..061d2dd 100644 --- a/app/src/main/java/sudoku/solver/MixedSolver.java +++ b/app/src/main/java/sudoku/solver/MixedSolver.java @@ -11,17 +11,17 @@ import sudoku.structure.Cell; import sudoku.structure.MultiDoku; import sudoku.structure.Sudoku; -public class MixedSolver implements Solver{ +public class MixedSolver implements Solver { - /** + /** * Résout le MultiDoku passé en paramètre, avec règles de déduction et * backtracking. * * @param doku MultiDoku, MultiDoku à résoudre. * @return boolean, valant true si le MultiDoku est résolu, false sinon. */ - @Override - public boolean solve(MultiDoku doku) { + @Override + public boolean solve(MultiDoku doku, List steps) { Random rand = new Random(); if (Thread.interrupted()) { @@ -49,6 +49,7 @@ public class MixedSolver implements Solver{ if (possibleSymbols.size() == 1) { cellToFill.setSymbolIndex(possibleSymbols.getFirst()); + addStep(cellToFill, steps); if (this.solve(doku)) { return true; } @@ -59,10 +60,12 @@ public class MixedSolver implements Solver{ int nextSymbol = possibleSymbols.get(nextPossibleSymbolIndex); cellToFill.setSymbolIndex(nextSymbol); + addStep(cellToFill, steps); if (this.solve(doku)) { return true; } cellToFill.setSymbolIndex(Cell.NOSYMBOL); + addStep(cellToFill, steps); possibleSymbols.remove(nextPossibleSymbolIndex); } diff --git a/app/src/main/java/sudoku/solver/RandomSolver.java b/app/src/main/java/sudoku/solver/RandomSolver.java index a90d7dd..63a9cb1 100644 --- a/app/src/main/java/sudoku/solver/RandomSolver.java +++ b/app/src/main/java/sudoku/solver/RandomSolver.java @@ -13,7 +13,7 @@ import sudoku.structure.Sudoku; public class RandomSolver implements Solver { - /** + /** * Résout, si possible, le multidoku passé en paramètre * en testant toutes les possibilités, de manière aléatoire, avec un algorithme * de backtracking. @@ -21,8 +21,8 @@ public class RandomSolver implements Solver { * @param doku Multidoku, à résoudre * @return boolean, true s'il est résolu ou false s'il ne l'est pas. */ - @Override - public boolean solve(MultiDoku doku) { + @Override + public boolean solve(MultiDoku doku, List steps) { Random rand = new Random(); if (Thread.interrupted()) @@ -51,10 +51,12 @@ public class RandomSolver implements Solver { int nextSymbol = possibleSymbols.get(nextPossibleSymbolIndex); cellToFill.setSymbolIndex(nextSymbol); + addStep(cellToFill, steps); if (this.solve(doku)) { return true; } cellToFill.setSymbolIndex(Cell.NOSYMBOL); + addStep(cellToFill, steps); possibleSymbols.remove(nextPossibleSymbolIndex); } diff --git a/app/src/main/java/sudoku/solver/Solver.java b/app/src/main/java/sudoku/solver/Solver.java index 8ea6bde..6ae2a99 100644 --- a/app/src/main/java/sudoku/solver/Solver.java +++ b/app/src/main/java/sudoku/solver/Solver.java @@ -8,14 +8,18 @@ import sudoku.structure.MultiDoku; public interface Solver { - /** + /** * Log du Solver, qui garde trace des actions réalisées. */ public static final Logger logger = Logger.getLogger("SolverLogger"); - boolean solve(MultiDoku doku); + boolean solve(MultiDoku doku, List solverSteps); - /** + default boolean solve(MultiDoku doku) { + return solve(doku, null); + } + + /** * Compte le nombre de solutions possibles au MultiDoku passé en paramètres. * * @param doku MultiDoku, MultiDoku dont on veut le nombre de solutions. @@ -44,4 +48,10 @@ public interface Solver { return result; } + default void addStep(Cell cell, List steps) { + if (steps == null) + return; + steps.add(new SolverStep(cell)); + } + } diff --git a/app/src/main/java/sudoku/solver/SolverStep.java b/app/src/main/java/sudoku/solver/SolverStep.java new file mode 100644 index 0000000..d8511bc --- /dev/null +++ b/app/src/main/java/sudoku/solver/SolverStep.java @@ -0,0 +1,23 @@ +package sudoku.solver; + +import sudoku.structure.Cell; + +public class SolverStep { + + private final Cell cell; + private final int newValue; + + public SolverStep(Cell cell) { + this.cell = cell; + this.newValue = cell.getSymbolIndex(); + } + + public int getNewValue() { + return newValue; + } + + public Cell getCell() { + return cell; + } + +}