public class Sudoku { static int [][]grille = { {0,0,0,0,3,0,0,6,2}, {0,0,0,0,7,2,0,0,1}, {2,0,0,6,0,0,8,0,0}, {1,0,9,4,0,6,0,8,7}, {0,0,4,0,0,0,2,0,0}, {5,8,0,1,0,7,6,0,4}, {0,0,6,0,0,1,0,0,3}, {4,0,0,3,8,0,0,0,0}, {7,3,0,0,6,0,0,0,0} }; public static boolean estDansLaColonne(int valeur,int colonne) { for (int ligne=0; ligne<9; ligne++) { if (grille[ligne][colonne]==valeur) return true; } return false; } public static boolean estDansLaLigne(int valeur,int ligne) { for (int colonne=0; colonne<9; colonne++) { if (grille[ligne][colonne]==valeur) return true; } return false; } public static boolean estDansLeCarre(int valeur,int ligne,int colonne) { int pointGauche = 3*(colonne/3); int pointHaut = 3*(ligne/3); for (int c=pointGauche; c<pointGauche+3; c++) { for (int l=pointHaut; l<pointHaut+3; l++) { if (grille[l][c]==valeur) return true; } } return false; } public static int compteur; public static boolean estValeurPossible(int valeur,int ligne,int colonne) { return !estDansLaColonne(valeur,colonne) && !estDansLaLigne(valeur,ligne) && !estDansLeCarre(valeur,ligne,colonne); } public static void affiche() { for (int l=0; l<9; l++) { for (int c=0; c<9; c++) { if (grille[l][c]!=0) System.out.print(grille[l][c]); else System.out.print(' '); } System.out.println(); } System.out.println(); } public static boolean trouveSolution(int ligne,int colonne) { compteur++; // calcul de la position suivante int ligneSuivante; int colonneSuivante; if (colonne==8) { ligneSuivante = ligne+1; colonneSuivante=0; } else { ligneSuivante = ligne; colonneSuivante = colonne+1; } // Est-ce que j'ai parcouru toutes les cases du tableau ? if (ligne==9) { affiche(); return true; } if (grille[ligne][colonne]!=0) { // case déjà remplie ==> case suivante return trouveSolution(ligneSuivante,colonneSuivante); } else { // case non remplie ==> je dois essayer les différentes valeurs for (int valeur=1; valeur<10; valeur++) { // si la je ne peux pas poser la valeur, je passe à la suivante if (!estValeurPossible(valeur,ligne,colonne)) continue; grille[ligne][colonne] = valeur; // je pose une valeur (hypothèse) boolean correct = trouveSolution(ligneSuivante,colonneSuivante); if (correct) return true; // c'est bon, la valeur était correcte } grille[ligne][colonne] = 0; // c'était une case "vide", on la remet return false; // Je n'ai pas trouvé de valeur correcte } } public static void main(String []a) { affiche(); compteur = 0; System.out.println(trouveSolution(0,0)+" nombre d'appels="+compteur); } }