/// <summary> /// Vyhľadaá trasu na grafe /// </summary> /// <param name="paZ">vychodrí bod</param> /// <param name="paDo">koncový bod</param> /// <param name="paDruhVozidla">alé je to vozidlo</param> /// <returns></returns> public static List <Hrana> NajdiTrasu(Poloha paZ, Poloha paDo, DruhVozidla paDruhVozidla) { aHernaPlocha = Hra.DajInstanciu().DajHernuPlochu(); aTrasa = new List <Hrana>(); aPolohaZ = paZ; aZacVrch = NajdiZaciatocnyVrchol(); aKonVrch = NajdiCielovyVrchol(paDo); if (aZacVrch == null || aKonVrch == null) { return(null); } if (aZacVrch == aKonVrch) { return(aTrasa); } aZacVrch.NajkratciaVzdialenost = 0; aAktVrch = aZacVrch; aAktVrch.Docastnost = false; PrejdiVystupnuHviezdu(); Backtracking(); aHernaPlocha.PovodnyStavVrcholov(); if (!aTrasa.Any()) { return(null); } return(aTrasa); }
/// <summary> /// Vytvorenie trasy podľa grafu /// </summary> private static void Backtracking() { aTrasa.Clear(); Vrchol druhy = aKonVrch; Vrchol prvy = aKonVrch.Predchodca; if (druhy == null || prvy == null) { return; } bool pokracuj = true; while (pokracuj) { foreach (var item in aHernaPlocha.ZoznamHran) { if (item.Vrchol2 == druhy && item.Vrchol1 == prvy) { aTrasa.Insert(0, item); if (prvy == aZacVrch) { pokracuj = false; } break; } } druhy = prvy; prvy = druhy.Predchodca; } }
/// <summary> /// vytvorenie novιho vrcholu /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> private void VyrvorVrchol(Policko paPolicko) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; }
/// <summary> /// vytvαranie vrcholu napojenιho na hranu /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> /// <param name="paPolickoVedlajsie">susednι polνθko</param> private void VytvorVrcholNapojenyNaHranu(Policko paPolicko, Policko paPolickoVedlajsie) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; paPolickoVedlajsie.Hrana.Vrchol2 = vr; }
/// <summary> /// Vytvorenie vrcholu vedΎa vrchoku /// </summary> /// <param name="paPolicko">policko</param> /// <param name="paPolickoVedlajsie">susedne policko</param> private void VytvorVrcholVedlaVrcholu(Policko paPolicko, Policko paPolickoVedlajsie) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; Hrana hr = new Hrana(); hr.Vrchol1 = paPolickoVedlajsie.Vrchol; hr.Vrchol2 = vr; aZoznamHran.Add(hr); }
/// <summary> /// Metoda kontroluje vystupnu hviezdu vrchola, ktorá je aktualny. /// Zistuje, porovnava a pripadne prepisuje vzdialenosti od vychodzieho vrchola /// </summary> private static void PrejdiVystupnuHviezdu() { Vrchol druhyVrch; int vzdialenostPred; int dlzkaPristupu; foreach (var item in aHernaPlocha.ZoznamHran) { if (item.Vrchol1 == aAktVrch && item.Vrchol2 != null) { druhyVrch = item.Vrchol2; vzdialenostPred = druhyVrch.NajkratciaVzdialenost; dlzkaPristupu = item.DajHodnotu() + aAktVrch.NajkratciaVzdialenost; if (dlzkaPristupu < vzdialenostPred) { druhyVrch.NajkratciaVzdialenost = dlzkaPristupu; druhyVrch.Predchodca = aAktVrch; } } } Vrchol novy = ZistiKtorymPokracovat(); if (novy == null) { return; } aAktVrch = novy; aAktVrch.Docastnost = false; if (aKonVrch.Docastnost) { PrejdiVystupnuHviezdu(); } }