SAE21_2023/Resolveur.java

75 lines
2.2 KiB
Java
Raw Normal View History

2024-04-06 20:23:50 +02:00
public class Resolveur {
public static boolean resoudreSudoku(int[][] grille) {
2024-04-03 12:13:16 +02:00
int row = -1;
int col = -1;
2024-04-06 20:23:50 +02:00
boolean estVide = true;
2024-04-03 12:13:16 +02:00
// Recherche d'une cellule vide dans la grille
2024-04-06 20:23:50 +02:00
for (int i = 0; i < grille.length; i++) {
for (int j = 0; j < grille[i].length; j++) {
if (grille[i][j] == 0) {
2024-04-03 12:13:16 +02:00
row = i;
col = j;
// Cellule vide trouvée
2024-04-06 20:23:50 +02:00
estVide = false;
2024-04-03 12:13:16 +02:00
break;
}
}
2024-04-06 20:23:50 +02:00
if (!estVide) {
2024-04-03 12:13:16 +02:00
break;
}
}
2024-04-06 20:23:50 +02:00
// Si la grille est pleine, le Sudoku est résolu
if (estVide) {
2024-04-03 12:13:16 +02:00
return true;
}
// Essayer de placer les chiffres de 1 à 9 dans la cellule vide
for (int num = 1; num <= 9; num++) {
2024-04-06 20:23:50 +02:00
if (estCoupValide(grille, row, col, num)) {
grille[row][col] = num;
// Résoudre récursivement le Sudoku
if (resoudreSudoku(grille)) {
2024-04-03 12:13:16 +02:00
return true;
}
// Annuler la valeur si la solution n'est pas possible
2024-04-06 20:23:50 +02:00
grille[row][col] = 0;
2024-04-03 12:13:16 +02:00
}
}
// Aucune solution n'est possible pour cette cellule
return false;
}
// Vérifie si un nombre peut être placé dans une cellule spécifique
2024-04-06 20:23:50 +02:00
private static boolean estCoupValide(int[][] grille, int row, int col, int num) {
2024-04-03 12:13:16 +02:00
// Vérifie la ligne
for (int x = 0; x < 9; x++) {
2024-04-06 20:23:50 +02:00
if (grille[row][x] == num) {
2024-04-03 12:13:16 +02:00
return false;
}
}
// Vérifie la colonne
for (int y = 0; y < 9; y++) {
2024-04-06 20:23:50 +02:00
if (grille[y][col] == num) {
2024-04-03 12:13:16 +02:00
return false;
}
}
// Vérifie la région 3x3
int regionRowStart = row - row % 3;
int regionColStart = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
2024-04-06 20:23:50 +02:00
if (grille[i + regionRowStart][j + regionColStart] == num) {
2024-04-03 12:13:16 +02:00
return false;
}
}
}
// La valeur peut être placée dans cette cellule
return true;
}
}