IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

algorithme recursif pour remplir un carré en diagonal


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut algorithme recursif pour remplir un carré en diagonal
    bonjour alors je fais appele a vous pour un coup de main au niveau du
    probléme
    du remplissage d'un carré recursivement voila une partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure trace(x, y, x_droite, y_bas, total_posees: integer);
    begin
      tab[x, y] := '$';
      afficher_tableau;
      if (x >= dim) and (y >= dim) then exit; // point d'arrêt
      if y = 1 then
      begin
        if x >= dim then inc(x_droite); // effet de bord
        x := x_droite;
        y := y_bas + 1;
        if y > dim then dec(y); // effet de bord
        y_bas := y;
        if total_posees < dim * dim then // carré rempli ?
          trace(x, y, x_droite, y_bas, total_posees + 1);
    l'instruction que je n'ai pas compris if x>=dim then
    inc(x_droite);effet de bord
    est ce que ça veut dire que qu'on depasse la taille de la dim on revien
    a la
    premiére case EN ICRéMENTANT??? ET POUR total_poseees lui on affecté
    une
    valeur pour la tester???
    VOILA AISEZ MOI SVP

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Bonjour à toi.

    Ce serait sympathique d'éditer ton post pour :
    - éviter le langage SMS
    - utiliser la balise CODE
    - un peu mieux mettre en page ton post car c'est limite lisible.
    - expliquer ce que tu entends par : remplissage d'un carré et comment modélises tu un carré ?

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut
    voila tout le probléme
    Supposons qu'on a un carré de 10x10 cases, et qu'on veut noircir toutes ses cases; le remplissage ne s'effectuera pas en ligne ou en colonne mais en diagonale, de gauche à droite et du bas vers le haut.


    Pour cela, si à un instant t on se trouve à la case de coordonnées (x,y), alors la prochaine case à noircir sera la case de coordonnées (x+1,y-1).


    Il faut prendre soin de tester les effets de bord (ne pas sortir du carré à force de décrémenter x ou d'incrémenter y).


    On en déduit donc que le point d'arrêt de la procédure est atteint quand les coordonnées x ou y se retrouvent en dehors du carré.


    On sait ensuite que lorsqu'on aura atteint la première ligne (y=1), alors il faut redémarrer le remplissage à la première colonne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure trace(x, y, x_droite, y_bas, total_posees: integer);
    begin
      tab[x, y] := '$';
      afficher_tableau;
      if (x >= dim) and (y >= dim) then exit; // point d'arrêt
      if y = 1 then
      begin
        if x >= dim then inc(x_droite); // effet de bord
        x := x_droite;
        y := y_bas + 1;
        if y > dim then dec(y); // effet de bord
        y_bas := y;
        if total_posees < dim * dim then // carré rempli ?
          trace(x, y, x_droite, y_bas, total_posees + 1);
      end
      else
        if x >= dim then
        begin
          if y_bas = dim then inc(x_droite); // effet de bord
          x := x_droite; y := y_bas;
          if total_posees < dim * dim then // carré rempli ?
            trace(x, y, x_droite, y_bas, total_posees + 1);
        end
        else
          if total_posees < dim * dim then // carré rempli ?
            trace(x + 1, y - 1, x_droite, y_bas, total_posees + 1);

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Il n'y a pas besoin de recursivité pour ce problème.

    Par exemple, voici un début de réponse (qui est finalement une réponse complète) :

    Notation : rect[i][j], i correspond à la ligne i et j à la colonne j et rect[1][1] correspond à la case supérieur gauche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Procédure rempli(Rectangle:rect)
     hauteur <- hauteur(rect);
     largeur <- largeur(rect);
     
     /*rempli la partie inférieur gauche*/
     De i=hauteur à 1
       De j=i à largeur
         rect[j][j-i+1] <- Noir
     
     /*rempli la partie supérieur droite*/
     De i=largeur à 2
       De j=i à hauteur
         rect[j][j-i+1] <- Noir

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut
    on peut pas le faire recursivement
    en prenant le point d'appui uqand on dépasse la dimension du tableau

  6. #6
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    bien le bonsoir,

    ton algo récursif n'est pas forcément le plus simple.
    si tu tiens absolument à remplir un carré récursivement, on peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    trace(entiers x,y){
       // on vérifie qu'on est toujours dans le tableau 
       // et qu'on n'est pas sur une case déjà noircie
       if (x>dim) ou (y < 1) ou (tableau[x][y] = '$')
          return ; // on ne fait rien et on quitte la fonction
     
       else{
          // on remplit et on récursive
          tableau[x][y] = '$';
          trace(x,y-1)
          trace(x+1,y)
       }
    }
    et il suffira d'appeler trace(1,10)

Discussions similaires

  1. filtrage pour detection de pics en algorithme recursif
    Par Eaque Arcana dans le forum Signal
    Réponses: 3
    Dernier message: 10/08/2009, 14h04
  2. Quel algorithme utilisé pour faire un arbre hiérarchique
    Par deaven dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/01/2005, 21h30
  3. Réponses: 6
    Dernier message: 24/01/2005, 14h12
  4. Algorithmes génériques pour affichage de primitives 2D.
    Par Selenite dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/01/2005, 20h20
  5. Réponses: 36
    Dernier message: 13/05/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo