Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sudoku en java

problème pour la résolution

    25 mars 2010 à 17:20:34

    Bonjour amis zero,
    je suis en première année de licence info et je dois réaliser un solveur de sudoku.
    Alors voilà, j'ai un problème avec ma fonction résolution : tout ce passe bien
    jusqu'à ce que mon programme atteigne la dernière case. Arrivé là il laisse la dernière
    case vide et le programme ne s'arrête pas. Dans ma fonction principale, j'ai une dernière
    instruction après l'appel de la fonction récursive qui permet d'afficher que le programme
    à trouvé une solution mais elle ne s'affiche pas donc je ne sort jamais de la fonction.
    Je précise que la fonction backTrack permet de retourner en arrière(ça fonctionne apparement)
    chiffrePossible permet de savoir si on peut mettre le chiffre dans la case.
    Voilà merci d'avance pour vos réponses :)
    (Désolé pour la présentation du code j'ai eu un peu de mal à la faire :p )
    boolean possible,trouve=false;
    int[] caseSuivante = caseSuivante(i,j,tabInit);
    int k;
    while(!trouve){
         if(i == 8 && j == 8){
    	for(k=1;k<10;k++){
            	if(chiffrePossible(k,i,j,tableauModifie)){
    			tableauModifie[i][j] = k;
    			trouve = true;
    		}
    	}
          }
          if(tableauModifie[i][j] == 0){
    	  possible = true;
    	  while(possible){
    		for(k=1;k<10;k++){
    			if(chiffrePossible(k,i,j,tableauModifie)){
    				tableauModifie[i][j] = k;
    				AS.refresh(tableauModifie);
    				tableauModifie = resolution(caseSuivante[0],caseSuivante[1],tableauModifie,tabInit,AS);
    			}
    			else{
    				tableauModifie[i][j] = 0;
    			}
    		}
    		possible = false;
    	   }
    	if(!verifTableau(tableauModifie)&&tableauModifie[i][j] == 0){
    		backTrack(caseAvant(i,j,tabInit),tabInit,tableauModifie,AS);
    	}
         }
         else{
    	tableauModifie = resolution(caseSuivante[0],caseSuivante[1],tableauModifie,tabInit,AS);
         }
    }
    return tableauModifie;
    
    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2010 à 19:04:27

      Ca risque d'être dur de trouver comme ca, en tout cas j'ai pas envie de passer trop de temps à comprendre ton code. Par contre je peux te conseiller d'utiliser un debugeur qui te permettra surement de trouver ton problème.

      Je note cependant l'inutilité de ta boucle while(possible), puisqu'elle s'exécute systématiquement une seule fois
      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2010 à 19:21:19

        A oui tient t'as raison elle sert à rien en faites cette boucle merci :)
        Et concernant le debuggeur je connais pas je compile avec javac en console.
        Et le programme compile bien, il donne même presque une solution sauf pour la dernière case.
        Mais il ne s'arrête pas donc je pense que c'est un problème dans la récursivité.
        J'essaie de comprendre mais c'est pas évident ^^
        • Partager sur Facebook
        • Partager sur Twitter
          25 mars 2010 à 20:08:52

          Bin chercher sur google pour un debugeur, perso j'utilise celui intégré à eclipse. Un débuguer n'a rien avoir avec un compilateur.
          • Partager sur Facebook
          • Partager sur Twitter
            25 mars 2010 à 20:10:09

            ok je vais voir ce que ça donne
            EDIT : j'ai résolu le chiffre manquant à la fin mais mon programme ne s'arrête toujours pas :colere2:
            Mon nouveau code :
            public static int[][] resolution(int i,int j,int[][] tableauModifie,int[][] tabInit,AffichageSudoku AS){
            		int[] caseSuivante = caseSuivante(i,j,tabInit);
            		int k;
            		if(caseSuivante[0] == 9){
            			k = 1;
            			while(k<10&&tableauModifie[i][j]==0){
            				if(chiffrePossible(k,i,j,tableauModifie)){
            					tableauModifie[i][j] = k;
            					AS.refresh(tableauModifie);
            					AS.afficheGagne();
            				}
            				k++;
            			}
            		}
            		if(tableauModifie[i][j] == 0){
            					for(k=1;k<10;k++){
            						if(chiffrePossible(k,i,j,tableauModifie)){
            							tableauModifie[i][j] = k;
            							AS.refresh(tableauModifie);
            							tableauModifie = resolution(caseSuivante[0],caseSuivante[1],tableauModifie,tabInit,AS);
            						}
            						else{
            							tableauModifie[i][j] = 0;
            						}
            					}
            					if(!verifTableau(tableauModifie)&&tableauModifie[i][j] == 0){
            						tableauModifie = backTrack(caseAvant(i,j,tabInit),tabInit,tableauModifie,AS);
            					}
            					}
            			else{
            				tableauModifie = resolution(caseSuivante[0],caseSuivante[1],tableauModifie,tabInit,AS);
            			}
            		return tableauModifie;
            	}
            
            • Partager sur Facebook
            • Partager sur Twitter

            Sudoku en java

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown