Merci pour l'info permettant (enfin !) de mettre des images dans le texte. Yeaahh.
Progressivement, à force de décortiquer, je me pose des questions.
Je proposerais bien de n'en avoir que deux classes :
Une classe arc et une classe nœud.
Dans la classe arc, on garde la tienne pour les cantons et pour une voie sans issue, on dit que le suivant, c'est 0 (zéro).
Dans la classe nœud, on définit 4 entrées sorties, systématiquement.
- pour une aiguille, l'une des entrées-sorties est à zéro, simplement.
- pour un croisement, une TJS, une TJD, un triple, on définit les 4.
Ordre proposé : 1 2
4 3
Par ailleurs, on définit quels sont les aboutements INTERNES sont possibles dans les nœuds :
- pour une aiguille, on aura 1,2,3,0 et 1-2, 1-3, 0, 0
- pour un croisement, on aura 1,2,3,4 et 1-3, 2-4, 0, 0
- pour une TJS, on aura 1,2,3,4 et 1-2, 1-3, 3-4, 0
- pour une TJD, on aura 1,2,3,4 et 1-2, 1-3, 2-4, 3-4
- pour un triple, on aura 1,2,3,4 et 1-2, 1-3, 1-4, 0
Les aboutements sont ordonnés (A<B). Quand on l’interrogera, on ordonnera aussi la demande.
Une autre remarque : quand on cherche à aller d'un point à un autre, c'est toujours d'un canton à un autre, jamais d'un nœud à un autre nœud.
Je sais qu'en théorie des graphes, on va d'un nœud à un autre...
Et, d'ailleurs, pour sortir des labyrinthes (ce qui est un peu notre cas), on met une croix à côté de l'entrée du tunnel qu'on choisit.
Donc, ce qu'on marque, ce n'est pas le nœud lui-même, mais l'une de ses extrémité.
Je ne me rappelle pas avoir déjà vu de méthode qui tenait compte du sens de parcours d'un arc (ce qui est différent du problème des arcs orientés dès la départ).
Dans ton exemple et ce que tu disais auparavant sur les circuits complets qui seraient impossibles, je dirai que :
Je sais aller de E à B, de E à D, de B à D, de D à B, de D à E, de E à C, de C à E. Mais ni de D à C ou de C à D.
Et tu t'occuperas du problème de l'inversion dans le loop{}
De cette manière, on ne retourne pas sur ses pas.
Dernière remarque :
J'ai l'impression que tu veux faire deux choses à la fois :
1°) Trouver toutes les façons d'aller de A à B. Là, je comprends bien.
2°) Gérer les incompatibilités en même temps.
J'aurais mieux compris, surtout dans le setup{}, que tu cherches tous les itinéraires possibles (quelques ms).
Tu les ranges (A<B).
Dans le setup{}, on peut perdre une seconde...
Et, dans le loop{}, tu géreras le fait que tel itinéraire ne peux pas être fait en même temps que tel autre, en testant parmi ceux que tu as trouvé auparavant.
J'espère avoir été constructif