Exemplo n.º 1
0
        /**
         * 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);
        }