Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide au design d'une fonction

    4 octobre 2007 à 11:10:29

    Tout d'abord pardonnez moi les fautes d'accent je travaille avec un clavier QWERTY!
    Bonjour a tous, je suis confronte a un probleme qui ne me parait pas evident, et apres avoir seche quelques heures sans aucune piste, je fais appel a votre experience pour me donner quelques pistes.

    Le probleme est le suivant, je dois creer une fonction:
    bool isNeighbor(int dimX, int dimY, int personA, personB);
    qui m'indique si deux personnes sont adjacentes dans un reseau (se touchent par au moins un cote).
    Les deux parametres dimX et dimY donnent les dimensions du "reseau" de personnes (qui est construit suivant les exemples qui sont donnes dans l'image) et les parametres personA et personB sont les personnes pour lesquelles il faut annoncer si elles sont "voisines" ou pas.

    Je pense que pour resoudre ce probleme, il faudra creer plusieurs sous fonctions qui resoudront chacunes une partie du probleme.
    J'insiste sur le fait que je ne demande pas qu'on m'ecrive le code mais juste une idee pour le "design" d'une solution au pb!!


    Merci beaucoup d'avance.

    Image utilisateur
    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2007 à 12:05:53

      si tu n'as pas encore trop codé, je te conseille vivement de revoir ton organisation de carreaux :

      si je regarde ton premier dessin ou dimx = 6 et dimy = 3, je lis, de gauche a droite, puis de haut en bas :

      0 3 1 4 2 5
      puis
      6 9 7 10 8 11
      puis
      12 15 13 16 14 17

      si, au lieu de les numéroter comme ça, tu les numérote :
      0 1 2 3 4 5
      puis
      6 7 8 9 10 11
      puis
      12 13 14 15 16 17

      Cet ordre de lecture marche dans tes 6 cas sans distinction de chacun de tes 6 cas.
      Essaie de les numéroter comme ça, tu verras, ça simplifiera tout : ligne par ligne en fait ! Avec chaque carreau pair un peu plus bas que les carreaux impairs de la meme ligne.

      Tu vois ce que je veux dire ?

      EDIT :
      Pour etre plus clair, moi ce que je vois, dans tes schémas, c'est une grille droite, avec juste les carreaux qui ont un X pairs un peu plus bas que ceux qui ont un X impair : donc numérote ça comme une grille. De plus tes DimX et DimY appuient completement cette façon de numéroter.
      Du coup, pour calculer les voisinages, tu n'as pas moulte cas particuliers a envisager : ça marchera toujours de la meme façon.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        4 octobre 2007 à 12:41:01

        Je suis tout a fait d'accord avec ton analyse malheureusement je n'ai pas bien le choix on m'impose cette organisation pour ajouter de la difficulte a l'exercice...
        • Partager sur Facebook
        • Partager sur Twitter
          4 octobre 2007 à 13:47:49

          En faite quand tu lis de HAUT en bas tu ne lis 0, 1, 2 et non 0, 3, 1, 4
          Il ne sont pas a la même hauteur ce demi carreau compte donc le problème est logique
          • Partager sur Facebook
          • Partager sur Twitter
            4 octobre 2007 à 14:11:56

            cyberjoac > ok, si tu dois garder cet ordre la, voila quelques idées qui me viennent :

            Tu peux quand meme garder la notion de ligne (quand je dis ligne, je dis que le cas 6, c'est une seule ligne :
            si tu as plusieurs lignes, ce sont des cas 6 qui s'empilent.
            Plusieurs tests :

            - A en dessous de B si et seulement A%X == B%X ET A/X = B/X+1.
            --> en gros, si leur position est la meme dans la ligne, ET que les lignes sont adjacentes.
            - A en dessus de B si et seulement A%X == B%X ET A/X = B/X-1.
            --> meme raisonnement

            Ensuite, chaque ligne peut etre découpée en 2 groupes :
            - si X est pair : par 2 groupes égaux de N cases avec N = X/2
            - si X est impair : par 2 groupes : N+1 cases au dessus, N en dessous, avec N = X/2 (vérifie avec tes exemples : pour le cas ou X = 5 tu as, en haut de la ligne : 3 cases ( = 5/2 (divisions entieres), en bas 2 cases

            Pour la case d'en bas d'une ligne, son voisin de gauche est égale a lui meme moins N, celui de droite est lui meme moins N, +1.
            -> evidemment, tester que le nombre calculé a le meme modulo : A%X et B%x -> sinon, tu n'est plus sur la meme ligne.
            Le voisin d'une case d'en bas, il faut voir le premier cas, multiligne, cité plus haut.

            Bref, tu as encore des cas a tester, et faut que j'aille bosser, je te laisse continuer !
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              4 octobre 2007 à 15:19:41

              Personellement, je commencerais par calculer le nombre d'hexagone de chaque ligne (horizontale, c'est à dire dans le premier exemple 0 1 2; 3 4 5; ...). Il s'agit en l'occurence de la partie entière superieure de dimX/2 pour les lignes paires (le premier indice en c++ est le 0), et de sa partie entière inferieure pour les lignes impaires.
              Ensuite, tu parcours ton tableau par lignes, paires et impaires

              Soit P le nombre d'hexagone des lignes paires et I le nombre d'hexagone de lignes impaires.
              Pour chaque hexagone, tu as directement les voisins diagonaux (pour les lignes paires, l'hexagone i a pour voisins "inferieurs décalés" i+P-1 et i+P si ils sont compris entre (numero de ligne/2)*P et ((numero de ligne/2)+1)*P. Si i+P est au delà, pas de voisins droit, si i+P-1 est en deça, pas de voisin gauche).
              Le voisin du bas est tout simplement l'hexagon i+dimX (pas de voisins si i+dimX est au superieur au nombre d'hexagone total).

              Bref, dans le cas des lignes paires, i et j seront voisins ssi j=(i+dimX ou i-dimX ou i+P ou i+P-1 ou i-P ou i-P+1).
              • Partager sur Facebook
              • Partager sur Twitter
                4 octobre 2007 à 17:36:41

                MERCI INFINIMENT POUR VOTRE AIDE A TOUS... j'ai beaucoup de pistes pour plancher serieusement...
                Je vais faire un petit mix de vos idees et reviendrait vous voir sous peu pour vous donner une ebauche de solution!!

                Merci encore c'est excellent!
                • Partager sur Facebook
                • Partager sur Twitter

                Aide au design d'une fonction

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown