ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет инфокоммуникационных Сетей и систем (иксс)
кафедра программной инженерии и вычислительной техники (пиивт)
Лабораторная работа №6
«Генерация лабиринтов»
Дисциплина: «Алгоритмы и структуры данных»
Выполнил: Студент группы ИКПИ-92 Яковлев М. А.
Принял: к.т.н., доцент кафедры ПИиВТ
Дагаев А. В.
Алгоритм Эллера
Алгоритм Эллера — это алгоритм генерации идеального лабиринта. Лабиринт считается идеальным, если у него нет замкнутых и зацикленных участков, и от любой точки до любой другой точки существует ровно один путь.
Организован как цикл добавления новых строк. Строка содержит одно и то же количество ячеек, которое произвольно задаётся в начале. Клетки относятся к множествам, которые служат для контроля возможности прохода между ячейками. На момент генерации текущей строки клетки одного множества соединены между собой, одновременно клетки из разных множеств находятся в изолированных между собой частях лабиринта. В общем, стенки лабиринта генерируются случайным образом, но при соблюдении определённых правил, которые гарантируют отсутствие зацикливаний.
Пример работы
Давайте рассмотрим классический метод генерации лабиринта по алгоритму Эллера. Хотя программное решение имеет некоторые отличия, основная идея остается неизменной.
Таблица 1. Эллера
1 |
2 |
3 |
|
1 |
1 |
3 |
|
1 |
1 |
3 |
|
|
|
|
1 |
1 |
3 |
|
1 |
2 |
2 |
|
|
|
|
|
|
|
|
|
|
|
Будем создавать лабиринт размером 3 на 3.
Шаг 1.
Присвоим каждой ячейке первой строки уникальные множества.
Шаг 2.
Случайным образом соединим первую и вторую ячейки, после чего они будут принадлежать одному и тому же множеству.
Шаг 3.
Теперь обратим внимание на нижние границы. Добавлять нижнюю границу можно только для тех множеств, которые содержат как минимум две ячейки. Добавим нижнюю границу у второй ячейки.
Шаг 4.
Вторая строка создается путем копирования первой строки, согласно алгоритму, надо из нее удалить все границы, которые были добавлены ранее.
Шаг 5.
Добавляется правая граница у первой ячейки, следовательно вторая теперь присвоена другому уникальному множеству.
Шаг 6.
Добавим нижнюю границу у третьей ячейки во второй строке. У первой ячейки границу добавлять нельзя, так как она в этой строке одна принадлежит множеству один.
Таблица 2. Эллера
1 |
1 |
3 |
|
1 |
1 |
3 |
|
1 |
1 |
3 |
1 |
2 |
2 |
|
1 |
2 |
2 |
|
1 |
2 |
2 |
1 |
2 |
2 |
|
1 |
1 |
4 |
|
1 |
1 |
1 |
Шаг 7.
Перешли на третью строку. Объединили первую и вторую ячейку в ней.
Шаг 8.
Случайно решено добавить правую границу у второй ячейки в третьей строке.
Шаг 9.
Принято решение закончить лабиринт. Добавим нижнюю границу к каждой ячейке, двигаясь слева направо. Если текущая ячейка и ячейка справа члены разных множеств, то: удалим правую границу, объединим множества текущей ячейки и ячейки справа.
Алгоритм Прима
Алгоритм Прима — это один из методов построения минимального остовного дерева, который можно адаптировать для генерации лабиринтов. Создается пустая сетка для лабиринта. Выбирается случайная стартовая ячейка, которая добавляется в «множество» посещенных ячеек. Создается список границ (стен), которые соединяют посещенные ячейки с непосещенными. Цикл генерации действует, пока есть границы: случайным образом выбирается одна из границ. Определяется, какая ячейка (посещенная или непосещенная) связана с этой границей. Если непосещенная ячейка: удалить границу (сделать проход). Добавляется непосещенная ячейка в множество посещенных. Добавляется новая граница, связанная с этой ячейкой, в список. Когда все ячейки посещены, генерация лабиринта заканчивается. Этот алгоритм позволяет создавать лабиринты с единственным путем между любыми двумя точками, что делает их интересными для навигации.
