2024-05-04 14:25:52 +02:00
|
|
|
import java.util.Arrays;
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
/**
|
|
|
|
* Classe pour résoudre une grille de Sudoku.
|
|
|
|
*
|
|
|
|
* @author Julian GALLEGO
|
|
|
|
* @author Wilfried BRIGITTE
|
|
|
|
*/
|
2024-04-02 12:35:30 +02:00
|
|
|
public class resolveurGrille {
|
|
|
|
|
|
|
|
private static int[][] solution = new int[9][9];
|
|
|
|
private static boolean stop = false;
|
2024-05-04 16:04:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Résout une grille de Sudoku.
|
|
|
|
*
|
|
|
|
* @param grille La grille à résoudre.
|
|
|
|
* @return La grille résolue.
|
|
|
|
*/
|
2024-04-02 12:35:30 +02:00
|
|
|
public static int[][] resoudreGrille(int[][] grille) {
|
2024-05-04 16:04:24 +02:00
|
|
|
// Remise à zéro de la solution
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int i = 0; i < 9; i++) {
|
|
|
|
for (int j = 0; j < 9; j++) {
|
|
|
|
solution[i][j] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
// Réinitialiser la valeur de stop à chaque début de résolution
|
2024-04-02 12:35:30 +02:00
|
|
|
resoudreSudoku(grille);
|
|
|
|
return solution;
|
|
|
|
}
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
/**
|
|
|
|
* Résout une grille de Sudoku.
|
|
|
|
*
|
|
|
|
* @param grille La grille à résoudre.
|
|
|
|
* @return true si une solution a été trouvée, sinon false.
|
|
|
|
*/
|
2024-04-27 20:51:28 +02:00
|
|
|
public static boolean resoudreSudoku(int[][] grille) {
|
2024-05-04 16:04:24 +02:00
|
|
|
//Parcours la grille
|
2024-04-27 20:51:28 +02:00
|
|
|
stop = false;
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int row = 0; row < 9; row++) {
|
|
|
|
for (int col = 0; col < 9; col++) {
|
|
|
|
if (grille[row][col] == 0) {
|
2024-05-04 16:04:24 +02:00
|
|
|
//essayer les chiffres de 1 a 9 pour la case vide
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int num = 1; num <= 9; num++) {
|
|
|
|
if (isValid(grille, row, col, num)) {
|
|
|
|
grille[row][col] = num;
|
|
|
|
resoudreSudoku(grille);
|
|
|
|
if (stop) {
|
2024-04-18 19:29:38 +02:00
|
|
|
return true;
|
2024-04-02 12:35:30 +02:00
|
|
|
}
|
2024-05-04 16:04:24 +02:00
|
|
|
grille[row][col] = 0; //réinitialiser la case si la solution n'est pas trouvée
|
2024-04-02 12:35:30 +02:00
|
|
|
}
|
|
|
|
}
|
2024-05-04 16:04:24 +02:00
|
|
|
return false; //Si aucune solution trouvée à cette étape on s'arrête
|
2024-04-02 12:35:30 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
//copier l a grille résolue dans la solution
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int i = 0; i < 9; i++) {
|
|
|
|
System.arraycopy(grille[i], 0, solution[i], 0, 9);
|
|
|
|
}
|
2024-04-18 19:29:38 +02:00
|
|
|
return stop = true;
|
2024-04-02 12:35:30 +02:00
|
|
|
}
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
/**
|
|
|
|
* Vérifie si un chiffre est valide dans une case donnée.
|
|
|
|
*
|
|
|
|
* @param grille La grille de Sudoku.
|
|
|
|
* @param row L'indice de ligne de la case.
|
|
|
|
* @param col L'indice de colonne de la case.
|
|
|
|
* @param num Le chiffre à vérifier.
|
|
|
|
* @return true si le chiffre est valide, sinon false.
|
|
|
|
*/
|
2024-05-04 14:25:52 +02:00
|
|
|
public static boolean isValid(int[][] grille, int row, int col, int num) {
|
2024-05-04 16:04:24 +02:00
|
|
|
//Vérifier la ligne
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int x = 0; x < 9; x++) {
|
2024-05-04 14:25:52 +02:00
|
|
|
if (grille[row][x] == num) {
|
|
|
|
return false;
|
2024-04-02 12:35:30 +02:00
|
|
|
}
|
|
|
|
}
|
2024-05-04 16:04:24 +02:00
|
|
|
//Vérifier la colonne
|
2024-04-02 12:35:30 +02:00
|
|
|
for (int x = 0; x < 9; x++) {
|
|
|
|
if (grille[x][col] == num) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-04 16:04:24 +02:00
|
|
|
//Vérifier la sous-grille 3x3
|
2024-04-02 12:35:30 +02:00
|
|
|
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 (grille[i + startRow][j + startCol] == num) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|