[sudoku] Résolution d'une grille 9*9 en java
80chris
Messages postés
18
Statut
Membre
-
80chris Messages postés 18 Statut Membre -
80chris Messages postés 18 Statut Membre -
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
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
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