예제 #1
0
 private Csúcs TerminálisCsúcsKeresés()
 {
     // Amíg a nyílt csúcsok halmaza nem nem üres.
     while (Nyilt.Count != 0)
     {
         // Ez a legnagyobb mélységű nyílt csúcs.
         Csúcs C = Nyilt.Pop();
         // Ezt kiterjesztem.
         List <Csúcs> újCsucsok = C.Kiterjesztes();
         foreach (Csúcs D in újCsucsok)
         {
             // Ha megtaláltam a terminális csúcsot, akkor kész vagyok.
             if (D.TerminálisCsúcsE())
             {
                 return(D);
             }
             // Csak azokat az új csúcsokat veszem fel a nyíltak közé,
             // amik nem szerepeltek még sem a zárt, sem a nyílt csúcsok halmazában.
             // A Contains a Csúcs osztályban megírt Equals metódust hívja.
             if (!Zárt.Contains(D) && !Nyilt.Contains(D))
             {
                 Nyilt.Push(D);
             }
         }
         // A kiterjesztett csúcsot átminősítem zárttá.
         Zárt.Add(C);
     }
     return(null);
 }
예제 #2
0
 // Ezt csak akkor szabad használni, ha biztos, hogy az állapottér gráfban nincs kör!
 // Különben valószínűleg végtelen ciklust okoz.
 private Csúcs TerminálisCsúcsKeresésGyorsan()
 {
     while (Nyilt.Count != 0)
     {
         Csúcs        C         = Nyilt.Pop();
         List <Csúcs> ujCsucsok = C.Kiterjesztes();
         foreach (Csúcs D in ujCsucsok)
         {
             if (D.TerminálisCsúcsE())
             {
                 return(D);
             }
             // Ha nincs kör, akkor felesleges megnézni, hogy D volt-e már nyíltak vagy a zártak közt.
             Nyilt.Push(D);
         }
         // Ha nincs kör, akkor felesleges C-t zárttá minősíteni.
     }
     return(null);
 }