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); }
// 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); }