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

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.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Начальная матрица.

1.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Выбираем начальную точку стартовой.

2.1.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Перемещаемся к случайному непосещенному соседу, пока таковые есть.

2.2.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Непосещенных соседей нет. Возвращаемся назад по стеку, пока нет непосещенных соседей.

2.1.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Непосещенные соседи есть. Перемещаемся к случайному непосещенному соседу.

2.

Generation és labirintus megoldás segítségével a keresési módszer a mélység a grafikon, savepearlharbor
<— Нет непосещенных клеток. Лабиринт сгенерирован.

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

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

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

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.

Kapcsolódó cikkek