Miklix

Генератор на лабиринти с алгоритъм на Kruskal

Публикувано: 16 февруари 2025 г. в 17:56:28 ч. UTC
Последна актуализация: 12 януари 2026 г. в 8:59:09 ч. UTC

Генератор на лабиринти, използващ алгоритъма на Крускал за създаване на перфектен лабиринт. Този алгоритъм е склонен да създава лабиринти със средно дълги коридори и много задънени улици, както и сравнително праволинейно решение.

Тази страница е машинно преведена от английски език, за да бъде достъпна за възможно най-много хора. За съжаление машинният превод все още не е съвършена технология, така че могат да възникнат грешки. Ако предпочитате, можете да видите оригиналната версия на английски език тук:

Kruskal's Algorithm Maze Generator

Алгоритъмът на Крускал е алгоритъм с минимално обхващащо дърво, който може да бъде адаптиран за генериране на лабиринти. Той е особено ефективен за създаване на перфектни лабиринти. Алтернатива на алгоритъма на Крускал е алгоритъмът на Прим, който също е алгоритъм с минимално обхващащо дърво, но тъй като те генерират идентични лабиринти и този на Крускал работи по-бързо, не съм си правил труда да имплементирам алгоритъма на Прим.

Перфектен лабиринт е лабиринт, в който има точно един път от всяка точка в лабиринта до всяка друга точка. Това означава, че не можете да се въртите в кръг, но често ще срещате задънени улици, което ще ви принуди да се обърнете и да се върнете обратно.

Генерираните тук карти на лабиринта включват версия по подразбиране без начални и крайни позиции, така че можете да ги определите сами: ще има решение от всяка точка в лабиринта до всяка друга точка. Ако искате да получите вдъхновение, можете да активирате предложена начална и крайна позиция - и дори да видите решението между двете.


Генериране на нов лабиринт








Относно алгоритъма на Крускал

Алгоритъмът на Крускал е създаден от Джоузеф Бернард Крускал-младши, американски математик, статистик и компютърен учен. Той описва алгоритъма за първи път през 1956 г. в своята статия „Върху най-късото обхващащо поддърво на граф и задачата на пътуващия търговец“.

Алгоритъмът е проектиран да намери минималното обхващащо дърво (MST) на граф, като гарантира, че всички върхове са свързани с минималното възможно общо тегло на ребрата, като същевременно се избягват цикли.

Как работи алгоритъмът на Крускал за генериране на лабиринти

Стъпка 1: Инициализиране

  • Третирайте всяка клетка в лабиринта като отделен набор (уникален компонент).
  • Избройте всички стени между съседни клетки като потенциални ръбове.

Стъпка 2: Сортиране на стените

  • Разбъркайте или подредете стените на случаен принцип. Ако го имплементирате като истински алгоритъм на Крускал, сортирайте стените в случаен ред (тъй като генерирането на лабиринт не изисква тегла).

Стъпка 3: Обработка на стени

  • Преминете през разместените стени.
  • Ако двете клетки, разделени от стената, принадлежат към различни множества (т.е. все още не са свързани в лабиринта), премахнете стената и обединете множествата.
  • Ако вече са в един и същи комплект, пропуснете стената (за да избегнете цикли).

Стъпка 4: Продължете до завършване

  • Повторете този процес, докато всички клетки бъдат свързани, образувайки едно обхващащо дърво.
  • В края всяка клетка е свързана с останалите без бримки или изолирани секции.

Тъй като алгоритъмът на Крускал разчита на сливане на множества, той може да бъде оптимизиран с помощта на алгоритъма Union-Find, който предоставя ефикасен начин за проследяване на свързани клетки по време на генериране на лабиринт. Можете да видите моята PHP имплементация на алгоритъма Union-Find тук: Връзка

Допълнително четене

Ако ви е харесала тази публикация, може да ви харесат и тези предложения:


Споделете в BlueskyСподелете във FacebookСподелете в LinkedInСподелете в TumblrСподелете в XСподелете в LinkedInЗакачи в Пинтерест

Микел Кристенсен

За автора

Микел Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.