/** * La Methode de Prim */ public HashSet <Liaison> Prim() { nbOperationLabyrinthe = 0; HashSet <Liaison> liaisionDechues = new HashSet <Liaison>(); HashSet <Liaison> liaisonPossible = new HashSet <Liaison>(); liaisonsFinales = new HashSet <Liaison>(); HashSet <Noeud> noeudFinale = new HashSet <Noeud>(); Noeud noeudToAdd = GetNoeud(0, 0); // Tant que le nombre cases possibles est inferieur à la surface du map while (noeudFinale.Count < GetMap().GetLargeur *GetMap().GetLongueur) { noeudFinale.Add(noeudToAdd); // on ajoute les voisins de la case ajouté dans les liaisons possible var values = EnumDirection.GetValues <Direction>(); Liaison liaisonTempo; foreach (Direction direction in values) { // try si le noeud n'a pas de voisin dans la direction donnée try { liaisonTempo = noeudToAdd.getLiaison(direction); // si la liaison est déjà présente dans les liaisons possibles if (liaisonPossible.Contains(liaisonTempo)) { // on supprime la liaison des liaisons possibles // et on l'ajoute dans les liaisons rejété // (car elle connecte deux Case déjà solution) liaisonPossible.Remove(liaisonTempo); liaisionDechues.Add(liaisonTempo); // TODO : debug pour send Event } else if (!liaisionDechues.Contains(liaisonTempo) && !liaisonsFinales.Contains(liaisonTempo)) { // on l'ajoute dans les liaisons possibles liaisonPossible.Add(liaisonTempo); // on notifie le UI nouvelle liaison possible // TODO : debug pour send Event } } catch (Exception) { // pass } nbOperationLabyrinthe += 1; } // S'il y a encore des liaisons possibles if (liaisonPossible.Count != 0) { // Recherche la prochaine liaison potentielle //liaisonTempo = liaisonPossible.OrderBy(x => this.CompareTo(x)); liaisonTempo = liaisonPossible.Min(); // on prend le noeud pas encore dans la solution if (!noeudFinale.Contains(liaisonTempo.NodeDepart)) { noeudToAdd = liaisonTempo.NodeDepart; } else { noeudToAdd = liaisonTempo.NodeArrive; } // on transfère la liaison de Possible à Solution Finale liaisonPossible.Remove(liaisonTempo); liaisonsFinales.Add(liaisonTempo); // on notifie le UI nouvelle liaison solution // TODO : sendEvent(liaisonTmp, 1); } } return(liaisonsFinales); }