Miklix

Генератор лабіринтів алгоритму Крускала

Опубліковано: 16 лютого 2025 р. о 18:00:54 UTC
Останнє оновлення: 12 січня 2026 р. о 08:59:25 UTC

Генератор лабіринтів, що використовує алгоритм Краскела для створення ідеального лабіринту. Цей алгоритм, як правило, створює лабіринти із коридорами середньої довжини та багатьма глухими кутами, а також має досить прямий розв'язок.

Ця сторінка була перекладена з англійської мови машинним перекладом, щоб зробити її доступною для якомога більшої кількості людей. На жаль, машинний переклад ще не є досконалою технологією, тому можуть траплятися помилки. Якщо ви бажаєте, ви можете переглянути оригінальну англійську версію тут:

Kruskal's Algorithm Maze Generator

Алгоритм Крускала — це алгоритм мінімального охоплюючого дерева, який можна адаптувати для генерації лабіринтів. Він особливо ефективний для створення ідеальних лабіринтів. Альтернативою алгоритму Крускала є алгоритм Прима, який також є алгоритмом мінімального охоплюючого дерева, але оскільки вони генерують ідентичні лабіринти, а алгоритм Крускала працює швидше, я не став впроваджувати алгоритм Прима.

Ідеальний лабіринт - це лабіринт, в якому існує рівно один шлях з будь-якої точки лабіринту в будь-яку іншу точку. Це означає, що ви не можете ходити по колу, але часто будете стикатися з глухими кутами, що змусить вас розвернутися і повернутися назад.

Карти лабіринту, згенеровані тут, включають версію за замовчуванням без стартових і фінішних позицій, тому ви можете визначити їх самостійно: з будь-якої точки лабіринту в будь-яку іншу точку буде знайдено шлях. Якщо вам потрібне натхнення, ви можете ввімкнути запропоновані позиції старту і фінішу - і навіть побачити рішення між ними.


Створіть новий лабіринт








Про алгоритм Крускала

Алгоритм Крускала був створений Джозефом Бернардом Крускалом-молодшим, американським математиком, статистиком та вченим-інформатиком. Він вперше описав алгоритм у 1956 році у своїй статті «Про найкоротше охоплююче піддерево графа та задачу комівояжера».

Алгоритм розроблено для знаходження мінімального охоплюючого дерева (MST) графа, гарантуючи, що всі вершини з'єднані з мінімально можливою загальною вагою ребер, уникаючи при цьому циклів.

Як працює алгоритм Крускала для генерації лабіринтів

Крок 1: Ініціалізація

  • Розглядайте кожну клітинку в лабіринті як окремий набір (унікальний компонент).
  • Перелічіть усі стіни між сусідніми клітинками як потенційні ребра.

Крок 2: Сортування стін

  • Перетасуйте або випадковим чином упорядкуйте стіни. Якщо реалізовано як справжній алгоритм Краскела, відсортуйте стіни у випадковому порядку (оскільки генерація лабіринту не потребує ваг).

Крок 3: Обробка стін

  • Переберіть перетасовані стіни.
  • Якщо дві клітини, розділені стіною, належать до різних множин (тобто вони ще не з'єднані в лабіринті), видаліть стіну та об'єднайте множини.
  • Якщо вони вже знаходяться в одному наборі, пропустіть стіну (щоб уникнути циклів).

Крок 4: Продовжуйте до завершення

  • Повторюйте цей процес, доки всі комірки не будуть з'єднані, утворюючи одне остовне дерево.
  • Зрештою, кожна клітина з'єднана з іншими без петель або ізольованих ділянок.

Оскільки алгоритм Крускала базується на об'єднанні множин, його можна оптимізувати за допомогою алгоритму Union-Find, який забезпечує ефективний спосіб відстеження пов'язаних комірок під час генерації лабіринту. Ви можете побачити мою PHP-реалізацію алгоритму Union-Find тут: Посилання

Додаткова література

Якщо вам сподобався цей пост, вам також можуть сподобатися ці пропозиції:


Поділитися на BlueskyПоділіться на FacebookПоділіться на LinkedInПоділіться на TumblrПоділитися на XПоділіться на LinkedInЗакріпити на Pinterest

Міккель Крістенсен

Про автора

Міккель Крістенсен
Міккель - творець і власник сайту miklix.com. Він має понад 20 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.