Ejemplo n.º 1
0
//Function récursive
struct Noeud* chercher(Arbre* racine, int valeur)
{
    //Dans le cas ou la racine est null ou la valeur est trouvée
	if(racine == NULL || valeur == racine->valeur)
	{
        if(racine == NULL)
        {
            //Retourn null
            racine = NULL;
        }
        else
        {
            //On retourne la racine
            racine = racine;
        }
	}
    //Dans le cas ou nous n'avons pas encore trouvée la valeur on regarde dans les sous arbre
    else
    {
        //On regarde à gauche si valeur inférieur
        if(valeur < racine->valeur)
        {
            racine = chercher(racine->gauche,valeur);
        }
        //On regarde à droite dans le cas contraire
        else
        {
            racine = chercher(racine->droit,valeur);
        }
        
    }
    return racine;
}
Ejemplo n.º 2
0
// OK
// Probleme avec le return temp ajoute un '%' à la fin.
// Ce n'est pas un problème d'affichage.
// Si l'on fait un simple return arbre2 dans la fonction on se retrouve aussi avec ce '%'. Problème non corrigé.
Arbre* fusion(Arbre* arbre1, Arbre* arbre2)
{
    Arbre * temp = arbre2;
    if(arbre2 != NULL && arbre1 != NULL)
    {
        // On recherche pour voir si la valeur arbre 1 est dans l'arbre 2
        if (chercher(arbre2,arbre1->valeur) == NULL)
        {
            // Dans le cas non on l'insère
            inserer(arbre2, arbre1->valeur);
        }
        
        // On fait de même pour l'arbre gauche et droite
        arbre2 = fusion(arbre1->gauche, arbre2);
        
        arbre2 = fusion(arbre1->droit, arbre2);
        temp = arbre2;
	}
    else
    {
        if (arbre2 == NULL )
        {
            temp = arbre1;
        }
        else if (arbre1 == NULL)
        {
            temp = arbre2;
        }
    }
    return temp;
}
Ejemplo n.º 3
0
//OK
struct Noeud* successeur(Arbre* racine, int valeur)
{
    struct Noeud* temp;
    int trouve=0;
    temp = chercher(racine,valeur);
    //Si la valeur est bien présente dans l'arbre
    if(temp != NULL)
    {
        //Dans le cas ou il n'y a pas de sous arbre droit
        if(minimum(temp->droit) == NULL)
        {
            //Successeur dans ses parents
            temp = parent(racine,valeur);
            while(temp != NULL && trouve==0)
            {
                if(temp->valeur < valeur)
                {
                    temp = parent(racine,temp->valeur);
                }
                else trouve =1;
            }
        }
        else
        {
            //On prend le plus petits des sous arbre droit
            temp = minimum(temp->droit);
        }
    }
    return temp;
    
}
Ejemplo n.º 4
0
//OK
struct Noeud* predecesseur(Arbre* racine, int valeur)
{
    struct Noeud* temp;
    int trouve=0;
    temp = chercher(racine,valeur);
    //Si la valeur est bien présente dans l'arbre
    if(temp != NULL)
    {
        //Dans le cas ou il n'y a pas de sous arbre gauche
        if(minimum(temp->gauche) == NULL)
        {
            //Predecesseur dans ses parents
            temp = parent(racine,valeur);
            while(temp != NULL && trouve==0)
            {
                if(temp->valeur > valeur)
                {
                    temp = parent(racine,temp->valeur);
                }
                else trouve =1;
            }
        }
        else
        {
            //On prend le plus grand des sous arbre gauche
            temp = maximum(temp->gauche);
        }
    }
    return temp;
    
}
Ejemplo n.º 5
0
////////////////////////////////////////////////////////////////////////
///
/// @fn NoeudAbstrait* ArbreRendu::ajouterNouveauNoeud(const std::string& typeParent, const std::string& typeNouveauNoeud)
///
/// Cette fonction permet d'ajouter un nouveau noeud dans l'arbre de
/// rendu.
///
/// @param[in] typeParent       : Le type du parent du nouveau noeud.
/// @param[in] typeNouveauNoeud : Le type du nouveau noeud.
///
/// @return Le noeud nouvellement créé.
///
////////////////////////////////////////////////////////////////////////
NoeudAbstrait* ArbreRendu::ajouterNouveauNoeud(
   const std::string& typeParent,
   const std::string& typeNouveauNoeud
   )
{
   NoeudAbstrait* parent = chercher(typeParent);
   if (parent == 0) {
      // Incapable de trouver le parent
      return 0;
   }

   NoeudAbstrait* nouveauNoeud = creerNoeud(typeNouveauNoeud);
   if (nouveauNoeud)
      parent->ajouter(nouveauNoeud);

   return nouveauNoeud;
}
Ejemplo n.º 6
0
int Chemin(SDL_Rect PositionOrig,SDL_Rect PositionDest)
{
      noeud ferme[Nb_Bloc_Largeur*Nb_Bloc_Hauteur]={};//la liste qui contient le chemin
      noeud ouvert[Nb_Bloc_Largeur*Nb_Bloc_Hauteur]={};//tout les noeud possible a parcourir
      int l=0;
      for(l=0 ; l<Nb_Bloc_Largeur*Nb_Bloc_Hauteur ; l++) tri9[l].i=tri9[l].j=-1;
      int videO,videF;// tester est ce que l ensemble ouvert et vide ou non
      videO=videF=0;//les ensembles sont vides au debut
      noeud considere;//le noeud qui subit les iterations
      noeud successeur;//pour inserer les voisins
      int x,y;//pour les coords des noeuds
	int dO,dF;//dans la liste ouverte et dans la liste fermée
      int succe=0;//un boulien qui declare l existence ou nn du chemin
      ouvert[0].coup=0;
      ouvert[0].estimation=distance((PositionOrig.x - cte1)/Taille_Bloc,(PositionOrig.y - cte2)/Taille_Bloc,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
      ouvert[0].evaluation=ouvert[0].estimation + ouvert[0].coup;
      ouvert[0].coords.i=ouvert[0].parent.i=(PositionOrig.x - cte1)/Taille_Bloc;
      ouvert[0].coords.j=ouvert[0].parent.j=(PositionOrig.y - cte2)/Taille_Bloc;
      videO++;
      while(videO != 0 && succe==0)//debut de la recherche du chemin
      {
            considere=lemeilleur(ouvert,videO);//on choisit le noeud consideré de telle sorte qu'il soit de poids minim
            if(considere.coords.i==((PositionDest.x - cte1)/Taille_Bloc) && considere.coords.j==((PositionDest.y - cte2)/Taille_Bloc))
                succe=1;//c'est fini
            else {
                  supprimernoeud(considere,ouvert,videO);//sinon on le retire de la liste ouverte
                  videO--;
                  ajouterliste(considere,ferme,videF);//on l insert dans la liste fermée puisqu il est de poids minimal
                  videF++;

                 //on ajoute mnt tous les noeuds adjacents
                  x=considere.coords.i+1;// les coords du noeud d adroite
                  y=considere.coords.j;
                  if(grille[x][y]==EMPTY && considere.coords.i<Nb_Bloc_Hauteur-1)//le noeud d'adroite doit etre vide et ne doit pas etre hors la grille
                     { dO=dansliste(x,y,ouvert,videO); dF=dansliste(x,y,ferme,videF);
					 if(dO==0 && dF==0)
                        //si le noeud n'est ni dans la liste fermée ni ouverte
                          {
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                             successeur.coords.i=x;//les coords de successeur
                             successeur.coords.j=y;
                             successeur.parent=considere.coords;//celles de son parent seront du noeud consideré en ce moment
                             ajouterliste(successeur,ouvert,videO);//on l ajoute a la liste ouverte pour choisir dans la prochaine iteration le meilleur noeud
                             videO++;
                          }
                           else  {
                              if(dO==1) successeur=chercher(x,y,ouvert); else successeur=chercher(x,y,ferme);
                              if(successeur.evaluation>(distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc)+considere.coup+1))
                              {
                             successeur.parent=considere.coords;
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                                    if(dF==1)
                                    {
                                      supprimernoeud(successeur,ferme,videF);
                                      videF--;
                                      ajouterliste(successeur,ouvert,videO);
                                      videO++;
                                    }
                                    else
                                    {
                                     supprimernoeud(successeur,ouvert,videO);
                                     videO--;
                                     ajouterliste(successeur,ouvert,videO);
                                     videO++;
                                    }
                               }
                        }
                      }


                  x=considere.coords.i-1;// les coords du noeud d agauche
                  y=considere.coords.j ;
                  if(grille[x][y]==EMPTY && considere.coords.i>0)//le noeud d'agauche doit etre vide et ne doit pas etre hors la grille
                    {    dO=dansliste(x,y,ouvert,videO); dF=dansliste(x,y,ferme,videF);
					 if(dO==0 && dF==0)
                        //si le noeud n'est ni dans la liste fermée ni ouverte
                          {
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                             //calcule du cout par la fct distance
                             successeur.coords.i=x;//les coords de successeur
                             successeur.coords.j=y;
                             successeur.parent=considere.coords;//celles de son parent seront du noeud consideré en ce moment
                             ajouterliste(successeur,ouvert,videO);//on l ajoute a la liste ouverte pour choisir dans la prochaine iteration le meilleur noeud
                             videO++;
                          }
                             else  {
                               if(dO==1) successeur=chercher(x,y,ouvert); else successeur=chercher(x,y,ferme);
                              if(successeur.evaluation>(distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc)+considere.coup+1))
                              {
                             successeur.parent=considere.coords;
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                                    if(dF==1)
                                    {
                                      supprimernoeud(successeur,ferme,videF);
                                      videF--;
                                      ajouterliste(successeur,ouvert,videO);
                                      videO++;
                                    }
                                    else
                                    {
                                     supprimernoeud(successeur,ouvert,videO);
                                     videO--;
                                     ajouterliste(successeur,ouvert,videO);
                                     videO++;
                                    }
                               }
                        }
					}

                  x=considere.coords.i;// les coords du noeud d bas
                  y=considere.coords.j+1;
                  if(grille[x][y]==EMPTY && considere.coords.j<Nb_Bloc_Largeur-1)//le noeud d'adroite doit etre vide et ne doit pas etre hors la grille
                     {   dO=dansliste(x,y,ouvert,videO); dF=dansliste(x,y,ferme,videF);
					 if(dO==0 && dF==0)
                        //si le noeud n'est ni dans la liste fermée ni ouverte
                          {
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                             successeur.coords.i=x;//les coords de successeur
                             successeur.coords.j=y;
                             successeur.parent=considere.coords;//celles de son parent seront du noeud consideré en ce moment
                             ajouterliste(successeur,ouvert,videO);//on l ajoute a la liste ouverte pour choisir dans la prochaine iteration le meilleur noeud
                             videO++;
                          }
                     else  {
                               if(dO==1) successeur=chercher(x,y,ouvert); else successeur=chercher(x,y,ferme);
                              if(successeur.evaluation>(distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc)+considere.coup+1))
                              {
                             successeur.parent=considere.coords;
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                                    if(dF==1)
                                    {
                                      supprimernoeud(successeur,ferme,videF);
                                      videF--;
                                      ajouterliste(successeur,ouvert,videO);
                                      videO++;
                                    }
                                    else
                                    {
                                     supprimernoeud(successeur,ouvert,videO);
                                     videO--;
                                     ajouterliste(successeur,ouvert,videO);
                                     videO++;
                                    }
                               }
                        }
                     }

                  x=considere.coords.i;// les coords du noeud d haut
                  y=considere.coords.j-1 ;
                  if(grille[x][y]==EMPTY && considere.coords.j>0)//le noeud d'agauche doit etre vide et ne doit pas etre hors la grille
                    {    dO=dansliste(x,y,ouvert,videO); dF=dansliste(x,y,ferme,videF);
					 if(dO==0 && dF==0)
                        //si le noeud n'est ni dans la liste fermée ni ouverte
                          {
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                             //calcule du cout par la fct distance
                             successeur.coords.i=x;//les coords de successeur
                             successeur.coords.j=y;
                             successeur.parent=considere.coords;//celles de son parent seront du noeud consideré en ce moment
                             ajouterliste(successeur,ouvert,videO);//on l ajoute a la liste ouverte pour choisir dans la prochaine iteration le meilleur noeud
                             videO++;
                          }
                  else  {
                               if(dO==1) successeur=chercher(x,y,ouvert); else successeur=chercher(x,y,ferme);
                              if(successeur.evaluation>(distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc)+considere.coup+1))
                              {
                             successeur.parent=considere.coords;
                             successeur.coup=considere.coup + 1;
                             successeur.estimation=distance(x,y,(PositionDest.x - cte1)/Taille_Bloc,(PositionDest.y - cte2)/Taille_Bloc);
                             successeur.evaluation=successeur.estimation+successeur.coup;
                                    if(dF==1)
                                    {
                                      supprimernoeud(successeur,ferme,videF);
                                      videF--;
                                      ajouterliste(successeur,ouvert,videO);
                                      videO++;
                                    }
                                    else
                                    {
                                     supprimernoeud(successeur,ouvert,videO);
                                     videO--;
                                     ajouterliste(successeur,ouvert,videO);
                                     videO++;
                                    }
                               }
                        }
                          }
                  }
            }
            while(videF!=0)
            {
            videF--;
            }
            while(videO!=0)
            {
            videO--;
            }
            if(succe == 1)
                  {
                  reconstituer(considere,ferme,PositionOrig);
                  return 1;
                  }
            else return 0;
}