SAE21_2023/SudokuSolver.java

71 lines
2.4 KiB
Java
Raw Normal View History

public class SudokuSolver {
public boolean solve(Grid grid) {
long startTime = System.currentTimeMillis(); // Temps de début de la résolution
boolean isSolved = solveRecursive(grid);
long endTime = System.currentTimeMillis(); // Temps de fin de la résolution
long duration = endTime - startTime; // Calcul de la durée de résolution
if (isSolved) {
System.out.println("La grille a été résolue en " + duration + " millisecondes.");
} else {
System.out.println("La grille est insoluble.");
}
return isSolved;
}
private boolean solveRecursive(Grid grid) {
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
if (grid.getCell(row, col).getValue() == 0) {
for (int num = 1; num <= 9; num++) {
if (isSafe(grid, row, col, num)) {
grid.getCell(row, col).setValue(num);
if (solveRecursive(grid)) {
return true;
}
// Backtrack si la solution actuelle n'est pas valide
grid.getCell(row, col).setValue(0);
}
}
// Aucun nombre n'est valide, donc la grille est insoluble
return false;
}
}
}
// Toutes les cellules ont été remplies, la grille est résolue
return true;
}
public boolean isSafe(Grid grid, int row, int col, int num) {
// Vérifier la ligne
for (int i = 0; i < 9; i++) {
if (grid.getCell(row, i).getValue() == num) {
return false;
}
}
// Vérifier la colonne
for (int i = 0; i < 9; i++) {
if (grid.getCell(i, col).getValue() == num) {
return false;
}
}
// Vérifier la région 3x3
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (grid.getCell(i + startRow, j + startCol).getValue() == num) {
return false;
}
}
}
return true;
}
}