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