[sudoku] Résolution d'une grille 9*9 en java
80chris
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
80chris Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
80chris Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
Bonjour a tous , je m'appelle christopher et je suis en 1er année d'informatique à Amiens , on a un projet à faire qui est de faire un programme qui résout une grille de sudoku 9*9 .
Le code est quasiment bon , l'ensemble des cases se remplissent mais il arrive sur certaines qu'elles contiennent un nombre plus grand que 9 ( 10 , 11 ou 12 ) . Et je n' arrive pas a déterminer la cause du problème et le projet est a rendre pour Mardi , si vous pourriez me donner un coup de main , ça serait vraiment sympa .
L'affichage de la grille est donné par les enseignants , il contient des valeurs initiales , et le 0 permet de coder une case vide .
Si vous avez besoin de plus d'information , n'hésitez pas
Voici le code qui selon moi pose problème :
Et voici le code en entier :
Merci d'avance pour votre aide
Pour vous aider a m'aider , je vais vous expliquer un peu le fonctionnement du code . J'ai créer trois fonctions , une fonction pour la ligne ,une pour la colonne , et pour le carré 3*3 . Chaque fonction a pour but de vérifier si le nombre n que l'on recherche est présent ou non .
Si il n'y est pas on peut mettre ce n , si il y est dans au moins 1 des 3 fonctions , on passe au n suivant et on test .
Si on arrive a 9 , aucune solution n'est possible et donc on revient a la case d'avant en changeant le n que l'on avait mis avant .
Voila je peux aussi vous poster le programme pour afficher la grille de sudoku si vous le souhaitez .
Le code est quasiment bon , l'ensemble des cases se remplissent mais il arrive sur certaines qu'elles contiennent un nombre plus grand que 9 ( 10 , 11 ou 12 ) . Et je n' arrive pas a déterminer la cause du problème et le projet est a rendre pour Mardi , si vous pourriez me donner un coup de main , ça serait vraiment sympa .
L'affichage de la grille est donné par les enseignants , il contient des valeurs initiales , et le 0 permet de coder une case vide .
Si vous avez besoin de plus d'information , n'hésitez pas
Voici le code qui selon moi pose problème :
public static void fonctionPrincipale(int[][]t, int n, int i , int j) { while((i<9)&&(j<9)) { if((t[i][j])!=0) { if(j==8) { j=0; i=i+1; } else { j=j+1; } } else { if((estDansLigne(t, n, i)==false)&&(estDansColonne(t, n, j)==false)&&(estDansCarre(t, n, i, j)==false)) { t[i][j]=n; if(j==8) { j=0; i=i+1; } else { j=j+1; } n=1; } else { if(n==9) { t[i][j]=0; if(j==0) { j=8; i=i-1; n=n+1;; } else { j=j-1; n=n+1;; } } else { n=n+1; } } } } }
Et voici le code en entier :
public class sudoku_antoine { public static boolean estDansLigne(int[][]t, int n, int i) { boolean test=false; int j=0; while((j<=8)&&(test==false)) { if(t[i][j]==n) { test=true; } else { test=false; } j=j+1; } return test; } public static boolean estDansColonne(int[][]t, int n, int j) { boolean test=false; int i=0; while((i<=8)&&(test==false)) { if(t[i][j]==n) { test=true; } else { test=false; } i=i+1; } return test; } public static boolean estDansCarre(int[][]t, int n, int i, int j) { int c=0; boolean test=false; int carreligne, carrecolonne, debutcarreligne, debutcarrecolonne, fincarreligne, fincarrecolonne; carreligne=i/3; carrecolonne=j/3; debutcarreligne=carreligne*3; debutcarrecolonne=carrecolonne*3; fincarreligne=debutcarreligne+2; fincarrecolonne=debutcarrecolonne+2; while((c<=8)&&(test==false)) { if(t[debutcarreligne][debutcarrecolonne]==n) { test=true; } else { test=false; } debutcarrecolonne=debutcarrecolonne+1; if(debutcarrecolonne%3==0) { debutcarrecolonne=debutcarrecolonne-3; debutcarreligne=debutcarreligne+1; } c=c+1; } return test; } public static void fonctionPrincipale(int[][]t, int n, int i , int j) { while((i<9)&&(j<9)) { if((t[i][j])!=0) { if(j==8) { j=0; i=i+1; } else { j=j+1; } } else { if((estDansLigne(t, n, i)==false)&&(estDansColonne(t, n, j)==false)&&(estDansCarre(t, n, i, j)==false)) { t[i][j]=n; if(j==8) { j=0; i=i+1; } else { j=j+1; } n=1; } else { if(n==9) { t[i][j]=0; if(j==0) { j=8; i=i-1; n=n+1;; } else { j=j-1; n=n+1;; } } else { n=n+1; } } } } } public static void main(String args[]) { int i,j,n; int[][]t = new int[9][9]; int[][]grille = new int[9][9]; n=1; i=0; j=0; t[0][5]=6; t[1][1]=5; t[1][6]=6; t[2][2]=1; t[2][6]=5; t[2][8]=8; t[3][0]=4; t[3][5]=9; t[3][8]=7; t[4][1]=6; t[4][7]=9; t[5][1]=3; t[5][3]=1; t[5][6]=4; t[5][7]=2; t[6][0]=3; t[6][1]=1; t[6][3]=9; t[6][5]=7; t[7][1]=9; t[7][2]=8; t[7][4]=2; t[7][5]=1; t[7][8]=3; t[8][1]=2; t[8][3]=3; t[8][6]=9; new AffichageSudoku(t, grille, 300); fonctionPrincipale(t,n,i,j); } }
Merci d'avance pour votre aide
Pour vous aider a m'aider , je vais vous expliquer un peu le fonctionnement du code . J'ai créer trois fonctions , une fonction pour la ligne ,une pour la colonne , et pour le carré 3*3 . Chaque fonction a pour but de vérifier si le nombre n que l'on recherche est présent ou non .
Si il n'y est pas on peut mettre ce n , si il y est dans au moins 1 des 3 fonctions , on passe au n suivant et on test .
Si on arrive a 9 , aucune solution n'est possible et donc on revient a la case d'avant en changeant le n que l'on avait mis avant .
Voila je peux aussi vous poster le programme pour afficher la grille de sudoku si vous le souhaitez .
A voir également:
- [sudoku] Résolution d'une grille 9*9 en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
2 réponses
Je ne comprends pas ton algo, pour moi il n'est pas correct... On dirait que tu prends le problème dans le mauvais sens : il ne faut pas tester systématiquement toutes les possibilités, mais plutôt travailler par élimination, à moins qu'il ne s'agisse de sudoku particulièrement complexes (avec des branches à exploiter).
J'aurais fait comme ça :
A chaque case, tu fais correspondre un objet avec toutes les valeurs possibles (1 à 9).
Quand tu charges ta grille, tu figes les valeurs connues, et tu laisses les autres.
Ensuite, tu parcours ta grille, et à chaque case tu enlèves des valeurs possibles toutes les valeurs déjà trouvées :
- sur la ligne
- sur la colonne
- dans la grille 3x3
et tu passes à la case suivante. Une fois la grille parcourue, tu recommences.
Si tu fais une passe complète sans rien modifier, sois :
- tu es bloqué => pas de solution déterministe
- tu as fini ta grille
Je crois que j'ai déjà répondu à un post sur le sujet...
J'aurais fait comme ça :
A chaque case, tu fais correspondre un objet avec toutes les valeurs possibles (1 à 9).
Quand tu charges ta grille, tu figes les valeurs connues, et tu laisses les autres.
Ensuite, tu parcours ta grille, et à chaque case tu enlèves des valeurs possibles toutes les valeurs déjà trouvées :
- sur la ligne
- sur la colonne
- dans la grille 3x3
et tu passes à la case suivante. Une fois la grille parcourue, tu recommences.
Si tu fais une passe complète sans rien modifier, sois :
- tu es bloqué => pas de solution déterministe
- tu as fini ta grille
Je crois que j'ai déjà répondu à un post sur le sujet...
Je ne sais pas si , avec mon niveau actuel je pourrais faire ceci . Mais merci de ton aide . mon algo devrait faire ceci :
si la case est différente de zéro ( il y a déjà un chiffre ) , alors on passe a la case suivante .
Sinon on teste pour un n si il est situé soit dans la ligne colonne ou carré , si c'est le cas on augmente n de 1 , si il n'y a pas de chiffre dans les 3 alors on met ce n dans la case et on passe a la case suivante .
Si un moment le n arrive a 9 ( il a fait toutes les possibilités , alors on revient a la case d'avant et on essaye avec n+1 ) . et on fait ceci tant que l'on est pas arrivé a la dernière case ( i=9 et j=9 ) .
On traite aussi toutes les exceptions ( si on est a la fin d'une ligne ou au début par exemple ) .
Voila , mais sinon t'auras pas une idée d'ou pourrait venir ce n qui prend 10 , 11 voir 12 alors qu'il devrait ne pas dépasser 9 ?
si la case est différente de zéro ( il y a déjà un chiffre ) , alors on passe a la case suivante .
Sinon on teste pour un n si il est situé soit dans la ligne colonne ou carré , si c'est le cas on augmente n de 1 , si il n'y a pas de chiffre dans les 3 alors on met ce n dans la case et on passe a la case suivante .
Si un moment le n arrive a 9 ( il a fait toutes les possibilités , alors on revient a la case d'avant et on essaye avec n+1 ) . et on fait ceci tant que l'on est pas arrivé a la dernière case ( i=9 et j=9 ) .
On traite aussi toutes les exceptions ( si on est a la fin d'une ligne ou au début par exemple ) .
Voila , mais sinon t'auras pas une idée d'ou pourrait venir ce n qui prend 10 , 11 voir 12 alors qu'il devrait ne pas dépasser 9 ?
Normalement : il se rend compte que la première case est vide , donc il va tester les fonctions , il va se rendre compte que aucune valeur n'est possible sauf 9 , et il va attacher 9 a la case . Mais je ce que je pense avoir programmer et ce que l'ordinateur comprend il y a une différence c'est sur . Toutefois il remplis quand même toutes les cases en respectant les contraintes . Même si mon algo est surement très mauvais , si il résous le Sudoku je serais déjà content