Miklix

Kruskal algoritmo labirinto generatorius

Paskelbta: 2025 m. vasario 16 d. 17:58:02 UTC
Paskutinį kartą atnaujinta: 2026 m. sausio 12 d. 08:59:17 UTC

Labirintų generatorius, naudojantis Kruskalo algoritmą tobulam labirintui sukurti. Šis algoritmas linkęs sukurti labirintus su vidutinio ilgio koridoriais ir daugybe aklaviečių, taip pat gana tiesiu sprendimu.

Šis puslapis buvo mašininiu būdu išverstas iš anglų kalbos, kad juo galėtų naudotis kuo daugiau žmonių. Deja, mašininis vertimas dar nėra tobula technologija, todėl gali pasitaikyti klaidų. Jei pageidaujate, originalią versiją anglų kalba galite peržiūrėti čia:

Kruskal's Algorithm Maze Generator

Kruskalo algoritmas yra minimalaus besidriekiančio medžio algoritmas, kurį galima pritaikyti labirintų generavimui. Jis ypač efektyvus kuriant tobulus labirintus. Alternatyva Kruskalo algoritmui yra Primo algoritmas, kuris taip pat yra minimalaus besidriekiančio medžio algoritmas, tačiau kadangi jie generuoja identiškus labirintus, o Kruskalo algoritmas veikia greičiau, aš nesivarginau įgyvendinti Primo algoritmo.

Tobulasis labirintas - tai labirintas, kuriame iš bet kurio labirinto taško į bet kurį kitą tašką veda lygiai vienas kelias. Tai reiškia, kad negalite eiti ratu, bet dažnai susidursite su aklavietėmis, todėl būsite priversti apsisukti ir grįžti atgal.

Čia sukurtuose labirinto žemėlapiuose yra numatytoji versija be pradžios ir pabaigos pozicijų, todėl jas galite nustatyti patys: iš bet kurio labirinto taško į bet kurį kitą tašką bus rastas sprendimas. Jei norite įkvėpimo, galite įjungti siūlomą pradžios ir pabaigos padėtį ir net pamatyti sprendimą tarp šių dviejų padėčių.


Sukurti naują labirintą








Apie Kruskalo algoritmą

Kruskalo algoritmą sukūrė amerikiečių matematikas, statistikas ir kompiuterių mokslininkas Josephas Bernardas Kruskalas jaunesnysis. Pirmą kartą algoritmą jis aprašė 1956 m. savo straipsnyje „Apie trumpiausią grafo besidriekiantį submedį ir keliaujančio pardavėjo problemą“.

Algoritmas sukurtas taip, kad rastų grafo minimalų besidriekiantį medį (MST), užtikrinant, kad visos viršūnės būtų sujungtos su kuo mažesniu bendru briaunų svoriu, vengiant ciklų.

Kaip Kruskalo algoritmas veikia labirinto generavimui

1 veiksmas: inicijavimas

  • Kiekvieną labirinto ląstelę traktuokite kaip atskirą rinkinį (unikalių komponentų).
  • Išvardykite visas sienas tarp gretimų langelių kaip galimas briaunas.

2 veiksmas: rūšiuokite sienas

  • Sumaišykite arba atsitiktine tvarka išdėliokite sienas. Jei įgyvendinate kaip tikrą Kruskalo algoritmą, rūšiuokite sienas atsitiktine tvarka (nes labirinto generavimui nereikia svorių).

3 žingsnis: Proceso sienos

  • Kartok per iškraipytas sienas.
  • Jei dvi siena atskirtos ląstelės priklauso skirtingiems rinkiniams (t. y. jos dar nėra sujungtos labirinte), pašalinkite sieną ir sujunkite rinkinius.
  • Jei jie jau yra tame pačiame rinkinyje, praleiskite sieną (kad išvengtumėte ciklų).

4 veiksmas: tęskite iki pabaigos

  • Kartokite šį procesą, kol visos ląstelės bus sujungtos ir sudarys vieną besidriekiantį medį.
  • Galiausiai kiekviena ląstelė yra sujungta su kitomis be kilpų ar izoliuotų sekcijų.

Kadangi Kruskalo algoritmas remiasi aibių suliejimu, jį galima optimizuoti naudojant „Union-Find“ algoritmą, kuris suteikia efektyvų būdą sekti sujungtas ląsteles labirinto generavimo metu. Mano PHP „Union-Find“ algoritmo įgyvendinimą galite pamatyti čia: Nuoroda

Papildoma literatūra

Jei jums patiko šis įrašas, jums taip pat gali patikti šie pasiūlymai:


Pasidalinkite „Bluesky“.Dalintis FacebookBendrinkite „LinkedIn“.Bendrinkite „Tumblr“.Dalintis XBendrinkite „LinkedIn“.Prisegti prie Pinterest

Mikkel Christensen

Apie autorių

Mikkel Christensen
Mikkelis yra miklix.com kūrėjas ir savininkas. Jis turi daugiau nei 20 metų profesionalaus kompiuterių programuotojo ir programinės įrangos kūrėjo patirtį ir šiuo metu visą darbo dieną dirba didelėje Europos IT korporacijoje. Kai jis nerašo tinklaraščio, laisvalaikį skiria įvairiems interesams, pomėgiams ir užsiėmimams, kurie tam tikra prasme gali atsispindėti šioje svetainėje nagrinėjamų temų įvairovėje.