Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor

Ez az első több tervezett cikkeket szentelt generáló és megoldása mazes.
Ebben a cikkben fogunk összpontosítani végrehajtására könnyen algoritmussal az „ideális” a labirintus, és annak alkalmazása a keresési útvonalon.
Úgy véljük, egy algoritmus alapján visszalépés, amely lehetővé teszi, hogy hozzon létre labirintusok nélkül ciklusok egyetlen utat két pont között. Az algoritmus nem a leggyorsabb, meglehetősen kevés erőforrást, mint a Euler algoritmus vagy Kruskal, de nagyon könnyen megvalósítható, és lehetővé teszi, hogy elágazó mazes nagyon hosszú zsákutca ágak.
Az érdekelt - kérdezem egy macska.
Az orosz internet nagyon kevés információ algoritmusok generálására labirintus, ami miatt írom ezt a cikket.
Példák kódot a C nyelv, valamint a teljes forráskódot a projekt elérhető a GitHub GNU GPLv3 licenc.
Linkek angol nyelvű források és a projekt meg fogja találni a végén a cikk.
Leírás az algoritmus
Megjegyzés: Feltételezzük, hogy kezdetben minden cella falai mind a négy oldalán, amely elválasztja a szomszédos cellákat.
1. Győződjön kezdeti sejt áram és jelölje meg azt látogatták meg.
2. Bár nem látogatott sejtek
1. Ha az aktuális cella nem látogatott „szomszédok”
1. Nyomja meg a jelenlegi cella a verem
2. Válasszon ki egy random sejt a szomszédos
3. Vegye fal között az aktuális cella és a választott
4. A kijelölt aktuális cella és jelölje meg azt látogatták meg.
2. Ellenkező esetben, ha a verem nem üres
1. Húzza ki a cellát a verem
2. Győződjön meg jelenlegi
3. Egyébként,
1. Válasszon ki egy random látogatott sejt, hogy a jelenlegi és a védjegy látogatták meg.
Lehet, hogy észrevette, hogy ha a 3. feltétel, kész labirintus valószínűleg lesz egy elszigetelt területre.
Ezt az állapotot tartalmazza az algoritmus kivételként a gyakorlatban normál működése során az algoritmus, és korrigálja a forrás adatokat, akkor nem végezték ki.
végrehajtás
Mint már említettük, azt feltételezzük, hogy az elején az algoritmus minden sejt elválasztjuk falak.
Illusztráció az algoritmus
0.

1.

2.1.

2.2.

2.1.

2.

a kód
Ismerkedés a legérdekesebb.
Kezdjük fellépni annak érdekében, és egy első, kezdeti mátrix, ami fut az algoritmus.
A kényelem, egyetértünk abban, hogy minden sejttípus van megadva a lista.
Most, hogy a készítmények kész, akkor kezdődik generálni.
Szerkezet jelentősen egyszerűsíti az életét kommunikációs funkciók között.
Kivonata kódot felelős előállító:
Mint látható, a végrehajtás az algoritmus egyszerű és elvont elmélet, mint mondják, „lehet kezelni még egy gyerek.”
Annak érdekében, hogy ne terhelje túl a cikk kódját használt funkciók a fenti folyosón, az spoiler.
getNeighbours függvény egy sejtsorokat látogatott szomszédok
removeWall függvény eltávolítja a fal között, a két sejtek:
Először a számított érték különbsége az első és a második koordináta pontokat. Nyilvánvaló, hogy az értéke lehet pozitív vagy negatív, vagy 0.
Meg kell találni az ilyen koordináták xy, ha hozzátéve, hogy a koordinátákat az első pont koordinátái kapott falak.
Mivel tudjuk, hogy a vektor különbsége a fal és a koordinátái az első pont, hogy (1 | 0) vagy (0, 1 |), tudjuk kihasználni azt.
! Tehát, az adalékanyag, X koordinátát xDiff = 0 lesz egyenlő xDiff / | xDiff |, amikor xDiff = 0, nullára. Y rendre.
Miután adalékok x és y, akkor könnyen kiszámítható a koordinátákat a fal között az első és második sejtek és hozzá a koordináták ezeknek a sejteknek látogatták meg.
Tehát most van egy labirintus generátor építhet labirintusok, amelynek mérete korlátozott, csak a méret a RAM.
Ennek eredményeként, akkor kap valamit, mint ez:
Labyrinths. Vigyázat, a forgalmat!
Létrehoz munka, most már könnyű: megtudja, ebben a labirintusban.
És még ennél is egyszerűbb, hiszen nem kell eltávolítani a falra.
útkereső algoritmus visszalépés:
1. Győződjön kezdeti sejt áram és jelölje meg azt látogatták meg.
2. Bár nem találtam ki
1. Ha az aktuális cella nem látogatott „szomszédok”
1. Nyomja meg a jelenlegi cella a verem
2. Válasszon ki egy random sejt a szomszédos
3. A kijelölt aktuális cella és jelölje meg azt látogatták meg.
2. Ellenkező esetben, ha a verem nem üres
1. Húzza ki a cellát a verem
2. Győződjön meg jelenlegi
3. Egyébként, nincs menekvés
Lássuk, mi történt:
Megoldva labirintus. Forgalom!
Piros jelzésű ösvény, kék - látogatott sejtekben.
100 × 100


Ez minden, amire szükség van egy nagyon egyszerű végrehajtását véletlenszerű mazes.
Az érdeklődők számára, a teljes forráskódot a projekt GitHub: Maze generátor és Solver (offscreen rendering)
OSMesa nem támogatja a bizonyos vezetők UNIX-alapú, és a Windows nem támogatja egyáltalán. hogy az érdekelt személyek, akik nem szerencsés az OS / vas, akkor javasoljuk, hogy megismerjék a kapcsolódó projekt: Maze generátor és Solver
Mindkét tervez végrehajtani algoritmusokkal, de az első rajz a memóriában, és kiadja a sorozat png képeket, és a második a képernyőn.
Összeszerelése cd építmények # 038; # 038;. / configure # 038; # 038; hogy ha kényelmetlen, a src mappában egy fájlt projekt QtCreator'a.