Rechercher : dans
Par :

JAVA - Recursivité

Dernière réponse le 23 nov 2007 à 14:35:17 Phara0, le 23 nov 2007 à 00:07:30 
 Signaler ce message aux modérateurs

Bonsoir à tous/toutes...

J'ai grandement besoin d'aide sur un problème , qui pour certains , peut paraitre assez bête :-)
Je programme en JAVA, un Solveur de Sudoku .. pour cela, je met en pratique une idée très simple :

Le Sudoku est representé par un tableau d'entiers à deux dimensions .

J'essaye de faire une fonction récursive , qui Teste toutes les solutions possibles pour une case , s'arrete lorsqu'elle rencontre un problème ( c'est a dire pas de solution pour une case ) , et revient "en arrière" (noeud d'avant) puis continue le parcours/remplissage du tableau dans le cas contraire .

De cette manière , en résolvant une grille , on doit avoir un Arbre avec des branches dont certaines << s'arrètent >> (celles pour lesquelles on a buté sur une case) , et l'une (ou plusieurs s'il y à plusieurs solutions ..) avec la solution : 81 branches !

C'est assez simple , mais je bute sur un problème (de programmation je pense..) , je n'arrive pas à traduire cette récursivité en JAVA..
Lorsque le Solveur rencontre une case a problème , il ne " revient pas en arrière " , ne test pas d'autres solutions pour la case qui la précède .

Pourriez-vous m'éclairer , et me dire en quoi ma récursion fausse ?

public boolean Resolve(int[][] vals){
		
	/* 1) on verifie si le sudoku est totalement résolu */
        if(toutestok(vals)) { Affiche(vals); return true; }
	
	else { // il manque des elements dans la grille

	for(int i=1;i<10;i++)
		for(int j=1;j<10;j++){ 

		if(vals[j][i]==-1){ /* si est une case inconnue (sont égales à -1) */
		/* pour chaque case, on test l'insertion des nb de 1 -> 9 */

		boolean found=false; // dit si oui ou non, une solution pour cette case a été trouvée
*/

		for(int nb=1;nb<10;nb++){
		/* Si NB vérifie les 3 conditions (ligne,colonne,carré..).. */
		if(verifConditions(nb,j,i,vals)){

		found=true; // on a trouvé une solution pour la case

		int[][] tempvals=new int[9][9];
		tempvals=vals; // On copie la grille courante dans un tableau temporaire 
		tempvals[j][i]=nb; // On y insère la solution
		Resolve(tempvals); // On rappelle Resolve( ) , avec la solution pour la case ( i , j )
		} // if nb
		} // for nb

		if(!found){ /* si malgres les 9 tests,pas de solution, on arrete la recherche sur cette
branche */
		return false; }

		} // si case à changer
		} // for j

	} // si manque des éléments
	return true;
	} // resolution




Comme dit plus haut , lors de l'execution ... l'algorithme semble ne pas être récursif , il ne revient pas "en arriere" pour tester d'autres valeurs sur la/les cases precedentes .
Si vous auriez une idée de ce qui ne va pas dans mon code , n'hesitez pas à m'eclairer , je vous en serais d'une grande reconnaissance ;-)
Merci d'avance !
Configuration: Linux Suse
Firefox 2.0.0.6

Meilleures réponses pour « JAVA Recursivité » dans :
Java - Les types de données Voir Les primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Installer Java sous Ubuntu VoirPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ...
[Logiciel libre] Installation firefox 2.0+java+flash VoirInstallation firefox 2.0+java+flash en ligne de commande A. INTRODUCTION B. INSTALLATION FIREFOX 1. Création d'environnement 2. Téléchargement et vérification de la signature 3. Installation de Firefox 4. Démarrage de l'application C....
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Java - Premier programme VoirPremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main...
J2EE - Java 2 Enterprise Edition VoirIntroduction au Java Framework Le «Java Framework» (Java 2 Platform) est composé de trois éditions, destinées à des usages différents : J2ME : Java 2 Micro Edition est prévu pour le développement d'applications embarquées, notamment sur des...
Java: les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Java sont typées, c'est-à-dire que les données contenues dans...

1

fiddy, le 23 nov 2007 à 01:08:32

Salut,

tempvals=vals;
ne va pas créer un deuxième tableau, puisque tu dis qu'il va avoir la même adresse.
Faut copier les éléments un par un.

Tiens moi au courant

Cordialement
Google is your friend

Répondre à fiddy

2

 kij_82, le 23 nov 2007 à 14:35:17

Salut,

Pour faire court.. rien de va dans ton code. Ce n'est pas de la vrai récursivité, tu n'utilise pas le retour de ta fonction pseudo récursive, et pour finir, l'algo afin de trouver la solution n'est pas bon (à mon avis).
Conclusion, je te conseille de repartir sur des bases neuves plutot qu'essayer de bidouiller ce qui est déjà fait.

Je sais que c'est pas très pro de n'apporter que des critiques et aucune solution mais je n'ai pas le temps pour te venir plus en aide pour le moment. Mais disons que pour faire bien, le mieux serait de gérer ca avec de vrai arbre. Des arbres non binaire (puisque tu peux avoir plusieurs fils).

Bon courage pour la suite.

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82