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

 C++ Discussion :

[C++ Algo] Faire un remplissage en escargot dans une matrice


Sujet :

C++

  1. #21
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Ma tentative de le faire sans récursion, parce que c'est plus marrant :

    Code C++ : 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
    27
    28
    29
    30
    31
    32
    33
    34
    const int DX[] = { 1, 0, -1, 0 };
    const int DY[] = { 0, 1, 0, -1 }; // DY = DX[(i + 3) % 4]
     
    void step(int x, int y) {
       printf("x=%d, y=%d\n", x, y);
    }
     
    void walk(int xMax, int yMax) {
       // A chaque itération, on ressert le contour à parcourir.
       for (int x1 = 0, y1 = 0, x2 = xMax, y2 = yMax; x1 < x2 && y1 < y2; ++x1, ++y1, --x2, --y2) {
           // On commence en haut à gauche et on réalise un contour complet en 4 étapes.
           int x = x1;
           int y = y1;
           for (int i = 0; i < 4; ++i) {
               // Le vecteur précalculé de déplacement à l'étape i.
               int dx = DX[i];
               int dy = DY[i];
               do {
                   // Dans le cas d'un contour plat (x2-x1=1 et/ou y2-y1=1),
                   // on ne marque pas les cases en dehors.
                   if (x1 <= x && x < x2 && y1 <= y && y < y2) {
                       step(x, y);
                   }
                   x += dx;
                   y += dy;
               } while (x1 <= x + dx && x + dx < x2 && y1 <= y + dy && y + dy < y2);
           }
       }
    }
     
    int main(int, char **) {
        walk(5, 2);
        return EXIT_SUCCESS;
    }

    Ca marche aussi avec des tailles du type 0x6, 1x1, 3x1, etc. Mine de rien, ce sont des cas aux limites bien pénibles (du moins en non récursif).

  2. #22
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi, je préfère cette méthode plutôt que la récursivité. Je n'utilise la récursivité que rarement, par exemple pour les arbres.
    Je pense surtout à la pile et au contre-exemple du calcul de !n.
    Pour le cas précis j'aurais peut-être été un peu plus détaillé, c'est à dire faire 4 boucles successives au lieu d'une seule avec 4 compteurs.

  3. #23
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Les arbres ça se parcour aussi sans récursivité ... tant qu'a faire.
    Mais bon, de nos jours je vois pas l'intérêt d'éviter la récursivité, tant que c'est bien placé et bien réfléchi. (la majorité des compilo implémentent le TCO)

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour Goten,
    de nos jours ...
    C'est vrai mais il y a tellement longtemps que j'ai commencé à développer, que certaines méthodes sont restées des habitudes. En Fortan on était obligé de trouver des astuces pour "tromper le compilateur" si on voulait faire des fonctions récursives.
    Je suis resté avec cette façon de penser qui consiste à dire que si on est dans environnement où on doit faire exactement la même chose que ce qui a amené à entrer dans cet environnement, alors c'est de la récursivité, sinon c'est de la répétition, bouclage.
    Dans le cas présent de remplissage avec décalage, pour moi, c'est plutôt du bouclage que de la récursivité.
    En cas de récursivité, il serait impossible de commencer par la fin, en cas de bouclage, cela ne présenterait, généralement, aucune difficulté.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [VBA-E] faire la moyenne et afficher dans une cellule
    Par tibss dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 15/05/2006, 17h03
  2. [VB6]ne pas faire la différence Maj/min dans une chaine
    Par dbozec dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/04/2006, 12h32
  3. Remplissage de vector dans une boucle
    Par anasama dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/01/2006, 09h07
  4. remplissage de champs dans une fenêtre sceondaire en javascr
    Par max.onyx dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/12/2005, 14h05
  5. [Débutant]Comment faire des tranches de nombre dans une tabl
    Par Jedecouvreaccess dans le forum Access
    Réponses: 7
    Dernier message: 05/09/2005, 08h46

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