![]() |
C/C++ & Visual C++Datové struktury a algoritmy (15.) |
||||||||||||||||
Úvodem | Datové struktury | Kurz DirectX | Downloads | Otázky a odpovědi |
|||||||||||||||||
Vítejte u dalšího dílu seriálu o datových strukturách. V posledním pokračování jsme si teoreticky probrali průchod stromem do šířky a přešli jsme k praktické ukázce využití dříve probraného průchodu do hloubky. Dnes si ukážeme příklad s tématikou průchodu do šířky. Problém bude opět vycházet z šachového prostředí. 15.1. Využití prohledávání do hloubky a do šířky15.1.1. Prohledávání do šířkyProblémem pro prohledávání do šířky pro nás bude úloha nalézt na šachovnici nejkratší cestu mezi dvěma poli pomocí koně. V tomto případě opět použijeme maticové reprezentace šachovnice, kde si na každé políčko uložíme hodnotu, která bude určovat v kterém tahu koněm jsme se na toto pole dostali. Na políčku prvním, z kterého začínáme, tedy bude 0. Na všech polích, na která je možno se dostat jedním tahem koně uložíme 1. V dalším kroku pak bereme všechna pole na kterých je hodnota 1 a z nich skáčeme na pole, která mají vzdálenost 1 tahu koněm od tohoto pole a na kterých jsme dosud nebyli. Tato pole budou mít hodnotu 2 atd. Na pole, která už byla dosažena v prvním tahu nemá cenu skákat, neboť bychom jen prodlužovali cestu a nalezená cesta by tedy nebyla nejkratší. Skákání po šachovnici končí okamžikem, kdy dosáhneme cílového pole. Hodnota na tomto poli pak udává, kolik bylo zapotřebí tahů k dosažení tohoto pole. Je vidět, že při poskakování si budeme muset uchovávat pole, do kterých jsme se tahem dostali, ale dále jsme z nich nepokračovali. V naší ukázce tato pole budeme hledat průchodem pole podle hodnot. Je to nejjednodušší řešení tohoto problému, neboť není třeba využívat jiných datových struktur. Ukážeme si tedy algoritmus pro nalezení cesty: void NajdiCestu(int _PozX, int _PozY, int _CilX, int _CilY) Tímto tedy máme v poli Sachovnice nalezenou cestu, pokud si pole necháme vypsat můžeme si ji jednoduše prstem nalézt. My bychom ji však chtěli v posloupnosti polí, která je nutno projít k dosažení cíle. K tomu použijeme techniku zpětného průchodu, kdy vyjdeme z cílového pole a budeme hledat cestu k poli výchozímu. Je jasné, že v okolí cílového pole musí být na dosah nějakého tahu koněm pole, které bude mít hodnotu o jedna nižší než pole cílové. Toto pole si vybereme a stejnou metodou budeme hledat pole s hodnotou o jedna nižší. Pokud se podíváme na výsledky hledání cesty pro šachovnici 4x4, uvidíme následující obrázek:
Zeleně je označeno pole výchozí, červeně pak pole cílové. Vidíme, že v okolí cílového pole na dosah jednoho tahu koně leží dvě pole s hodnotou čtyři. Protože však hledáme libovolnou nejkratší cestu, pak je nám jedno, které pole si vybereme. Následuje algoritmus zpětného průchodu, který vypíše posloupnost polí navštívených koněm od cílového pole k výchozímu: void ZpetnyPruchod(int _PozX, int _PozY, int _CilX,
int _CilY) Ve funkci main() se zeptáme na výchozí a cílový bod pohybu koně. Ověříme, zda tato pole opravdu leží uvnitř šachovnice a pak provedeme nalezení cesty. Předpokládáme, že úloha je zadána správně. Např. na šachovnici 3x3 nemusí jít cesta nalézt, od rozměru 4x4 je vše v pořádku. 15.2. Co bude příštěV příštím dílu si srovnáme oba typy průchodů stromem, neboť se oba nehodí na libovolnou činnost. Pokusíme se zoptimalizovat průchod do hloubky heuristikou. A určitě ještě něco navíc. Těším se příště nashledanou. |
|||||||||||||||||