From fc7ae023877c4b784a49d96804466be1620e303b Mon Sep 17 00:00:00 2001 From: Melvyn Date: Thu, 23 Jan 2025 16:28:41 +0100 Subject: [PATCH] feat : Solver.solve() --- app/src/main/java/sudoku/Cell.java | 4 +++ app/src/main/java/sudoku/Main.java | 8 ------ app/src/main/java/sudoku/MultiDoku.java | 19 +++++++++++++ app/src/main/java/sudoku/Sudoku.java | 27 ++++++++++++++++++ app/src/main/java/sudoku/solver/Solver.java | 31 ++++++++++++++++++++- 5 files changed, 80 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/sudoku/Cell.java b/app/src/main/java/sudoku/Cell.java index 32be9b7..6cb1847 100644 --- a/app/src/main/java/sudoku/Cell.java +++ b/app/src/main/java/sudoku/Cell.java @@ -72,6 +72,10 @@ public abstract class Cell { } */ + public boolean isEmpty() { + return this.symbolIndex == Cell.NOSYMBOL; + } + public boolean equalsValue(Cell otherCell) { return otherCell.getSymbolIndex() == this.getSymbolIndex(); } diff --git a/app/src/main/java/sudoku/Main.java b/app/src/main/java/sudoku/Main.java index fe57633..2b32777 100644 --- a/app/src/main/java/sudoku/Main.java +++ b/app/src/main/java/sudoku/Main.java @@ -3,17 +3,9 @@ */ package sudoku; -import sudoku.constraint.BlockConstraint; -import sudoku.constraint.ColumnConstraint; -import sudoku.constraint.IConstraint; -import sudoku.constraint.LineConstraint; import sudoku.io.SudokuPrinter; -import sudoku.io.SudokuSerializer; -import sudoku.solver.Solver; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; public class Main { public String getGreeting() { diff --git a/app/src/main/java/sudoku/MultiDoku.java b/app/src/main/java/sudoku/MultiDoku.java index 0e4a2c5..59a170d 100644 --- a/app/src/main/java/sudoku/MultiDoku.java +++ b/app/src/main/java/sudoku/MultiDoku.java @@ -50,4 +50,23 @@ public class MultiDoku { sb.append("\n}"); return sb.toString(); } + + public MutableCell getFirstEmptyMutableCell() { + for (Sudoku sudoku : this.subGrids) { + MutableCell cellTmp = sudoku.getFirstEmptyMutableCell(); + if (cellTmp.isEmpty()) { + return cellTmp; + } + } + return null; + } + + public List getPossibleSymbolsOfCell(MutableCell cellToFill) { + for (Sudoku sudoku : this.subGrids) { + if (sudoku.contains(cellToFill)) { + return sudoku.getPossibleSymbolsOfCell(cellToFill); + } + } + return new ArrayList<>(); + } } diff --git a/app/src/main/java/sudoku/Sudoku.java b/app/src/main/java/sudoku/Sudoku.java index e0401e4..0ee1776 100644 --- a/app/src/main/java/sudoku/Sudoku.java +++ b/app/src/main/java/sudoku/Sudoku.java @@ -162,4 +162,31 @@ public class Sudoku { sb.append("\n}"); return sb.toString(); } + + public MutableCell getFirstEmptyMutableCell() { + for (MutableCell cell : this.getMutableCells()) { + if (cell.isEmpty()) { + return cell; + } + } + return null; + } + + public List getPossibleSymbolsOfCell(MutableCell cellToFill) { + List result = new ArrayList<>(); + Coordinate cellCoordinates; + try { + cellCoordinates = this.getCoordinateCell(cellToFill); + } catch (Exception e) { + return result; + } + for (IConstraint constraint : this.constraints) { + if (result.isEmpty()) { + result.addAll(constraint.getPossibleSymbols(this, cellCoordinates.getX(), cellCoordinates.getY())); + } else { + result.retainAll(constraint.getPossibleSymbols(this, cellCoordinates.getX(), cellCoordinates.getY())); + } + } + return result; + } } diff --git a/app/src/main/java/sudoku/solver/Solver.java b/app/src/main/java/sudoku/solver/Solver.java index 59da5eb..87aeac8 100644 --- a/app/src/main/java/sudoku/solver/Solver.java +++ b/app/src/main/java/sudoku/solver/Solver.java @@ -10,14 +10,41 @@ import java.util.Random; import java.util.Stack; public class Solver { - Stack stack; public Solver() {} + /** + * Résout le multidoku passé en paramètre si c'est possible. + * En testant toutes les possibilités avec un algorithme de backtracking. + * @param doku Multidouke, à résoudre + * @return boolean, true s'il est résolut ou false s'il ne l'est pas. + */ + public boolean solve(MultiDoku doku) { + MutableCell cellToFill = doku.getFirstEmptyMutableCell(); + if (cellToFill == null) { + return true; + } + + List possibleSymbols = doku.getPossibleSymbolsOfCell(cellToFill); + if (possibleSymbols.isEmpty()) { + return false; + } + + for (int symbol : possibleSymbols) { + cellToFill.setSymbolIndex(symbol); + return this.solve(doku); + } + return false; + } + + /* + Ancien algo abandonné pour le moment + private void rollBack() { stack.pop(); } + public MultiDoku solve(MultiDoku doku, List constraints) throws Exception { List allMutableCells = doku.getMutableCells(); List remainingCellsToCheck = new ArrayList<>(allMutableCells); @@ -39,4 +66,6 @@ public class Solver { } return doku; } + + */ }