Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de Taquin

Construction du graphe

1 mai 2012 à 22:14:12

Bonjour à tous,
j'ai besoin d'aide pour construire un graphe d'état pour modéliser un taquin 3x3.
Voilà ce que j'ai fait jusqu'à maintenant.


La classe pour construire l'arbre
import java.util.Iterator;
import java.util.LinkedList;

public class ArbreTaquin {
	private Arbre gTaquin;
	private Etat noeud;
	
	public Etat getNoeud() {
		return noeud;
	}

	public void setNoeud(Etat noeud) {
		this.noeud = noeud;
	}

	public ArbreTaquin(){	
		int[] tab={1,2,3,4,-1,5,6,7,8};
		String nom = ""+tab[0];
		for(int i=1;i<tab.length;i++){
			nom=nom+"/"+tab[i];
		}
		noeud=new Etat(nom,tab);
		gTaquin=new Arbre(noeud);
	}
	
	public Arbre arbreTaquin(Etat n){
		
		LinkedList<Etat> succNoeud;	
		succNoeud=n.rechercheSucc();	
		Iterator<Etat> ite =succNoeud.iterator();
		Etat e;
		while(ite.hasNext()){
			e=ite.next();
			System.out.println(gTaquin.getRacine().getNom());
			if(gTaquin.rechercher(gTaquin.getRacine(), e) == null){	//si le noeud n'éxiste pas on l'ajoute et récursive sur ce noeud
				System.out.println(gTaquin.rechercher(gTaquin.getRacine(), e));
				System.out.println("bob");
				n.ajouterSucc(e, 1);
				/*arbreTaquin(e);*/
				
			}else{				//sinon on ajoute le chaînage
				System.out.println("john");
				n.ajouterSucc(e, 1);
			
				
			}
		}
		
		return gTaquin;
	}
	
	
}



package iagraphe;

import java.util.ListIterator;

public class Arbre {

	private Noeud racine;

	public Arbre(Noeud rac) {
		racine = rac;
	}
	
	public Noeud getRacine() {
		return racine;
	}

	public void setRacine(Noeud racine) {
		this.racine = racine;
	}

	public void addSucc(Noeud noeud, Noeud succ, int cout) {
		Noeud n = null;
		System.out.print("essai\n");
		n = rechercher(this.getRacine(), noeud);
		if(n != null) {
			n.ajouterSucc(succ, cout);
		}
		else {
			System.out.print("erreur addSucc dans arbre.java");
		}
	}
	
	public Noeud rechercher(Noeud racine, Noeud noeud) {
		Noeud tmp;
		System.out.print("essai recherche\n");
		if(racine.getNom().equals(noeud.getNom())) {
			System.out.print("if recherche\n");
			return racine;
		}
		/*else if(racine.getSuccesseur().contains(noeud)) {
			System.out.print("if1\n");
			return racine.getSuccesseur().get(racine.getSuccesseur().indexOf(noeud));
		}*/
		else if(racine.getSuccesseur().isEmpty()) {
			System.out.print("elseif\n");
			return null;
		}
		else {
			
			ListIterator<Noeud> ite=racine.getSuccesseur().listIterator();
			Noeud n;
			while(ite.hasNext()){
				n=ite.next();
				if(n.getNom().equals(noeud.getNom())){
					return n;
				}
				tmp = rechercher(n, noeud);
				if(tmp!= null){
					return tmp;
				}
			}
			return null;
		}
	}
	
}


package iagraphe;

import java.util.LinkedList;

public class Etat extends Noeud{

	private int tabetat[]=new int[/*9*/4];

	
	public Etat(String name,int tab[]) {
		super(name);
		tabetat=tab;
	}

	public int[] getTabetat() {
		return tabetat;
	}

	public void setTabetat(int tabetat[]) {
		this.tabetat = tabetat;
	}

	public LinkedList<Etat> rechercheSucc() {
		LinkedList<Etat> ret;
		ret=new LinkedList<Etat>();
		int posTrou = 0;

		
		for(int i=0;i<tabetat.length;i++){
			if(tabetat[i]==-1){
				posTrou=i;
			}
		}

		if(posTrou-1>-1 && posTrou!=3 && posTrou!=6){
			int tabetatbisgauche[]=new int[9];
			tabetatbisgauche=tabetat.clone();
			tabetatbisgauche[posTrou]=tabetatbisgauche[posTrou-1];
			tabetatbisgauche[posTrou-1]=-1;
			ret.add(new Etat(Nom(tabetatbisgauche),tabetatbisgauche));

	
		}
		if(posTrou+1<9 && posTrou!=2 && posTrou!=5){
			int tabetatbisdroite[]=new int[9];
			tabetatbisdroite=tabetat.clone();
			tabetatbisdroite[posTrou]=tabetatbisdroite[posTrou+1];
			tabetatbisdroite[posTrou+1]=-1;
			ret.add(new Etat(Nom(tabetatbisdroite),tabetatbisdroite));

		}
		if(posTrou+3<9){
			int tabetatbishaut[]=new int[9];
			tabetatbishaut=tabetat.clone();
			tabetatbishaut[posTrou]=tabetatbishaut[posTrou+3];
			tabetatbishaut[posTrou+3]=-1;
			ret.add(new Etat(Nom(tabetatbishaut),tabetatbishaut));

		}
		
		if(posTrou-3>-1){
			int tabetatbisbas[]=new int[9];
			tabetatbisbas=tabetat.clone();
			tabetatbisbas[posTrou]=tabetatbisbas[posTrou-3];
			tabetatbisbas[posTrou-3]=-1;
			ret.add(new Etat(Nom(tabetatbisbas),tabetatbisbas));
			
		}

		return ret;
	}

	public String Nom(int[] t) {
		String retour = ""+t[0];
		for(int i=1;i<t.length;i++){
			retour=retour+"/"+t[i];
		}
		return retour;
	}

	
	
}


package iagraphe;

import java.util.LinkedList;
import java.util.List;

public class Noeud {

	private String nom;
	private List<Noeud> successeur;
	private List<Integer> cout;
	
	public Noeud(String name) {
		this.nom = name;
		successeur = new LinkedList<Noeud>();
		cout = new LinkedList<Integer>();
	}
	
	public void ajouterSucc(Noeud succ, int cost) {
		successeur.add(succ);
		cout.add(cost);
	}
	
	public Noeud creerSucc(Noeud racine, String nom, int cost) {
		Noeud n = new Noeud(nom);
		racine.ajouterSucc(n, cost);
		return n;
	}
	
	
	
	public String getNom() {
		return nom;
	}
	public void setNom(String nom) {
		this.nom = nom;
	}
	public List<Noeud> getSuccesseur() {
		return successeur;
	}
	public void setSuccesseur(List<Noeud> successeur) {
		this.successeur = successeur;
	}
	public List<Integer> getCout() {
		return cout;
	}
	public void setCout(List<Integer> cout) {
		this.cout = cout;
	}
	
	public boolean egal(Noeud n) {
		if(n.getNom() == this.getNom()) {
			return true;
		}
		else return false;
	}
	
}
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2021 à 21:43:39

bonjour ;

si vous êtes toujours en vie , vous pouvez m'envoyer votre code source svp :)

Cordialement / RIP

  • Partager sur Facebook
  • Partager sur Twitter

abdelmalek bouhedja

11 février 2021 à 21:49:36

Bonjour,  @malikdu21  Merci de ne pas déterrer d'ancien sujet.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • ·soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • ·soit de créer un nouveau sujet décrivant votre propre contexte
  • ·ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet.

  • Partager sur Facebook
  • Partager sur Twitter