commit41f1be6be7Author: ROGER <gwendal.roger@etu.univ-lyon1.fr> Date: Tue Feb 4 16:18:24 2025 +0100 04/02/2025 : Ajout de Console.errorln pour les remontée d'erreurs commitef3506c4ebAuthor: ROGER <gwendal.roger@etu.univ-lyon1.fr> Date: Tue Feb 4 16:07:59 2025 +0100 04/02/2025 : Ajout de la JavaDoc commitf57aa34d36Author: Morph01 <thibaut6969delastreet@gmail.com> Date: Mon Feb 3 11:37:12 2025 +0100 Squashed commit of the following: commit 60c1634e1a159bf992b2ed1cdff632490294c48b Author: Morph01 <thibaut6969delastreet@gmail.com> Date: Mon Feb 3 11:36:25 2025 +0100 fix: remove .idea et .vscode
82 lines
3.0 KiB
Java
82 lines
3.0 KiB
Java
package sudoku;
|
|
|
|
import java.util.List;
|
|
|
|
import sudoku.core.Console;
|
|
|
|
public class ResolveurBacktraceSimple implements Resolveur {
|
|
|
|
/**
|
|
* Méthode permettant de résoudre un sudoku à partir des paramètres suivant :</br>
|
|
* - S : Sudoku</br>
|
|
* - afficherEtape : 0 ou 1
|
|
* @param s
|
|
* @param afficherEtape
|
|
* @return
|
|
*/
|
|
@Override
|
|
public boolean resoudre(Sudoku s, boolean afficherEtape) {
|
|
EtatResolution etat = new EtatResolution(0, 0);
|
|
boolean solved = resoudre(s, afficherEtape, etat);
|
|
if (!solved) {
|
|
Console.errorln("Ce Sudoku n'a pas de solution");
|
|
}
|
|
return solved;
|
|
}
|
|
|
|
private boolean resoudre(Sudoku s, boolean afficherEtape, EtatResolution etat) {
|
|
Grille g = s.getGrille();
|
|
List<Symbole> symboles = g.getSymbolesPossibles();
|
|
for (int i = 0; i < g.getTaille(); i++) { // Parcours des lignes
|
|
for (int j = 0; j < g.getTaille(); j++) { // Parcours des colonnes
|
|
Case c = g.getCase(i, j); // Récupération de la case
|
|
if (c.getSymbole() == null) { // Si la case est vide
|
|
for (Symbole symbole : symboles) { // Parcours des symboles possibles
|
|
c.setSymbole(symbole); // Affectation du symbole
|
|
etat.compteurGeneral++; // Incrémenter le compteur général
|
|
if (afficherEtape) {
|
|
afficherEtapeResolution(s, etat.compteur, etat.compteurGeneral);
|
|
}
|
|
if (s.estValide(c)) { // Si la grille est valide
|
|
etat.compteur++;
|
|
if (resoudre(s, afficherEtape, etat)) { // Résolution récursive
|
|
return true; // Si la grille est résolue
|
|
}
|
|
etat.compteur--;
|
|
}
|
|
c.setSymbole(null); // Réinitialisation de la case
|
|
}
|
|
return false; // Si aucun symbole ne convient
|
|
}
|
|
}
|
|
}
|
|
return true; // Si la grille est déjà résolue
|
|
}
|
|
|
|
/**
|
|
* Méthode permettant d'afficher le sudoku à chaque étape de sa résolution
|
|
* @param s
|
|
* @param compteur
|
|
* @param compteurGeneral
|
|
*/
|
|
private void afficherEtapeResolution(Sudoku s, int compteur, int compteurGeneral) {
|
|
System.out.println("Sudoku, Etape " + compteur + " (Tentative " + compteurGeneral + ")");
|
|
System.out.println(s.getGrille().toString());
|
|
}
|
|
|
|
|
|
private static class EtatResolution {
|
|
int compteur;
|
|
int compteurGeneral;
|
|
|
|
/**
|
|
* Méthode permettant de fixer l'état de la résolution
|
|
* @param compteur
|
|
* @param compteurGeneral
|
|
*/
|
|
EtatResolution(int compteur, int compteurGeneral) {
|
|
this.compteur = compteur;
|
|
this.compteurGeneral = compteurGeneral;
|
|
}
|
|
}
|
|
} |