Voilà mon problème. Je suis en train de programmer en JAVA un programme permettant de générer des grilles de Sudoku. Le programme est fonctionnel car il me génère des grilles. Malheureusement, il ne me génère pas tout le temps la grille, et toutes les x lancements de la compilation du code (le x varie entre 3 à 32 en moyenne), j'ai un beau message d'erreur : java.lang.StackOverflowError.
Est ce que quelqu'un pourrait m’expliquer le fait que la plupart du temps le programme marche sauf les fois ou il me met ce message d'erreur?
Merci d'avance !
Voici le code :
Code :
publicclass Grille {
privateint[][] sudoku;
public Grille() {
sudoku = newint[9][9];
genGrille(0, 0);
}
publicint[][] getGrille() {
return sudoku;
}
privatevoid genGrille(int x, int y) {
if (x < 9) {
if (x == -1) {
System.out.println("Erreur !!!!" );
}
int precvaleur = sudoku[x][y];
sudoku[x][y] = 10;
int[] possible = newint[9];
int compteur = 0;
for (int i = 1; i <= 9; i++) {
if (verif(x, y, i)) {
possible[compteur] = i;
compteur++;
}
}
int nbalea = (int) (Math.random() * compteur);
sudoku[x][y] = possible[nbalea];
//System.out.println("Le nombre aléatoire est "+nbalea+" qui ajoute le nombre "+sudoku[x][y]);
if (possible[nbalea] == 0) {
if (y > 0) {
if (x == 0 && y == 0) {
genGrille(x, y);
} elseif (y == 0) {
genGrille(x, y - 1);
} else {
genGrille(x - 1, 8);
}
}
}
if (y == 8) {
//System.out.println(sudoku[x][y]);
genGrille(x + 1, 0);
} else {
//System.out.print(sudoku[x][y] + " " );
genGrille(x, y + 1);
}
}
}
private boolean verifligne(int x, int nombre) {
int i = 0;
while (i < 8 && sudoku[x][i] != nombre) {
i++;
}
if (sudoku[x][i] == nombre) {
returnfalse;
}
returntrue;
}
private boolean verifcolonne(int y, int nombre) {
int i = 0;
while (i < 8 && sudoku[i][y] != nombre) {
i++;
}
if (sudoku[i][y] == nombre) {
returnfalse;
}
returntrue;
}
private boolean verifcarre(int x, int y, int nombre) {
if (y < 3 && x < 3) {
return carre(0, 0, nombre);
} elseif (y < 6 && x < 3) {
return carre(0, 3, nombre);
} elseif (y < 9 && x < 3) {
return carre(0, 6, nombre);
} elseif (y < 3 && x < 6) {
return carre(3, 0, nombre);
} elseif (y < 6 && x < 6) {
return carre(3, 3, nombre);
} elseif (y < 9 && x < 6) {
return carre(3, 6, nombre);
} elseif (y < 3 && x < 9) {
return carre(6, 0, nombre);
} elseif (y < 6 && x < 9) {
return carre(6, 3, nombre);
} elseif (y < 9 && x < 9) {
return carre(6, 6, nombre);
}
returnfalse;
}
private boolean carre(int x, int y, int nombre) {
for (int i = x; i <= x + 2; i++) {
for (int j = y; j <= y + 2; j++) {
if (sudoku[i][j] == nombre) {
returnfalse;
}
}
}
returntrue;
}
private boolean verif(int x, int y, int nombre) {
if (!verifligne(x, nombre)) {
returnfalse;
}
if (!verifcolonne(y, nombre)) {
returnfalse;
}
if (!verifcarre(x, y, nombre)) {
returnfalse;
}
returntrue;
}
}
Dans mon main je fais juste un appel pour créer une nouvelle grille.
Voici le message d'erreur :
Code :
Exception in thread "main" java.lang.StackOverflowError
at gsudoku2.Grille.genGrille(Grille.java:35)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:59)
at gsudoku2.Grille.genGrille(Grille.java:56)
at gsudoku2.Grille.genGrille(Grille.java:50)
[...]
Java Result: 1
Voici enfin le résultat quand tout ce passe normalement : (l'affichage est gérer dans le main)
Code :
run:
--------------------------
| 7 6 8 | 1 9 4 | 3 2 5 |
| 5 9 2 | 7 8 3 | 4 1 6 |
| 1 3 4 | 5 2 6 | 7 8 9 |
--------------------------
| 8 7 1 | 4 6 9 | 5 3 2 |
| 9 5 3 | 2 1 8 | 6 4 7 |
| 4 2 6 | 3 5 7 | 1 9 8 |
--------------------------
| 6 1 7 | 9 3 2 | 8 5 4 |
| 3 8 9 | 6 4 5 | 2 7 1 |
| 2 4 5 | 8 7 1 | 9 6 3 |
BUILD SUCCESSFUL (total time: 0 seconds)
Message édité par maximus95380 le 07-10-2012 à 01:23:25
Ta méthode genGrille est récursive : il y a un cas où elle ne fait que s'appeler elle même (il manque un critère d'arrêt) et ça pète en StackOverFlow (tu as rempli la pille d'appel)
Marsh Posté le 07-10-2012 à 01:11:21
Bonjour tout le monde.
Voilà mon problème. Je suis en train de programmer en JAVA un programme permettant de générer des grilles de Sudoku. Le programme est fonctionnel car il me génère des grilles. Malheureusement, il ne me génère pas tout le temps la grille, et toutes les x lancements de la compilation du code (le x varie entre 3 à 32 en moyenne), j'ai un beau message d'erreur : java.lang.StackOverflowError.
Est ce que quelqu'un pourrait m’expliquer le fait que la plupart du temps le programme marche sauf les fois ou il me met ce message d'erreur?
Merci d'avance !
Voici le code :
Dans mon main je fais juste un appel pour créer une nouvelle grille.
Voici le message d'erreur :
Voici enfin le résultat quand tout ce passe normalement :
(l'affichage est gérer dans le main)
Message édité par maximus95380 le 07-10-2012 à 01:23:25