SAE21_2024/Sudoku/resolveurGrille.java

77 lines
2.5 KiB
Java
Raw Normal View History

public class resolveurGrille {
private static int[][] solution = new int[9][9];
private static boolean stop = false;
public static int[][] resoudreGrille(int[][] grille) {
/*remise à zéro de la solution*/
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
solution[i][j] = 0;
}
}
/* Réinitialiser la valeur de stop à chaque début de résolution*/
resoudreSudoku(grille);
return solution;
}
2024-04-27 20:51:28 +02:00
public static boolean resoudreSudoku(int[][] grille) {
/*parcourage la grille*/
2024-04-27 20:51:28 +02:00
stop = false;
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
if (grille[row][col] == 0) {
/*essayer les chiffres de 1 a 9 pour la case vide*/
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;
}
grille[row][col] = 0; /*réinitialiser la case si la solution n'est pas trouvée*/
}
}
2024-04-18 19:29:38 +02:00
return false; /* Si aucune solution trouvée à cette étape on s'arrêtee*/
}
}
}
2024-04-30 14:51:04 +02:00
/*copier l a grille résolue dans la solution*/
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;
}
/*Méthode pour vérifier la validité d'un chiffre dans une case donnée*/
private static boolean isValid(int[][] grille, int row, int col, int num) {
/*Vérifier la ligne*/
for (int x = 0; x < 9; x++) {
if (grille[row][x] == num) {
return false;
}
}
/*Vérifier la colonne*/
for (int x = 0; x < 9; x++) {
if (grille[x][col] == num) {
return false;
}
}
/*Vérifier la sous-grille 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 (grille[i + startRow][j + startCol] == num) {
return false;
}
}
}
return true;
}
}