Возможно, вы могли бы разработать для этого алгоритмы, которые являются второстепенными вариантами ряда алгоритмов генерации случайных лабиринтов.Я предлагаю один, основанный на методе union-find .
Основная идея в union-find заключается в том, чтобы задавать набор элементов, которые разбиты на непересекающиеся (не перекрывающиеся) подмножества., чтобы быстро определить, к какому разделу принадлежит конкретный элемент.«Объединение» объединяет два непересекающихся набора вместе, чтобы сформировать больший набор, «поиск» определяет, к какому разделу принадлежит конкретный член.Идея состоит в том, что каждый раздел набора может быть идентифицирован конкретным членом набора, поэтому вы можете формировать древовидные структуры, в которых указатели указывают от элемента к элементу в направлении корня.Вы можете объединить два раздела (учитывая произвольный элемент для каждого), сначала найдя корень для каждого раздела, а затем изменив (ранее нулевой) указатель для одного корня, чтобы он указывал на другой.
Вы можете сформулировать свою проблемукак проблема непересекающегося союза.Первоначально каждая отдельная ячейка является отдельным разделом.Вам нужно объединить разделы, пока вы не получите небольшое количество разделенных (не обязательно двух) соединенных ячеек.Затем вы просто выбираете один (возможно, самый большой) из разделов и рисуете его.
Для каждой ячейки вам понадобится указатель (изначально нулевой) для объединения.Вам, вероятно, понадобится немного вектора, чтобы он действовал как набор соседних ячеек.Первоначально каждая ячейка будет иметь набор из четырех (или восьми) соседних ячеек.
Для каждой итерации вы выбираете ячейку случайным образом, а затем следуйте по цепочке указателей, чтобы найти ее корень.В подробностях от корня вы найдете множество соседей.Выберите случайного члена из этого, затем найдите корень для этого, чтобы идентифицировать соседний регион.Выполните объединение (укажите один корень к другому и т. Д.), Чтобы объединить два региона.Повторяйте до тех пор, пока вы не будете довольны одним из регионов.
При объединении разделов новый набор соседей для нового корня будет представлять собой набор симметричной разности (исключая или) наборов соседей для двух предыдущих корней.
Вы, вероятно, захотите сохранить другие данные по мере увеличения ваших разделов - например, размер - в каждом корневом элементе.Вы можете использовать это, чтобы быть более избирательным в отношении продолжения работы с конкретным объединением и помочь решить, когда остановиться.Может иметь значение некоторая мера рассеяния ячеек в разделе - например, небольшое отклонение или стандартное отклонение (относительно большого числа ячеек), вероятно, указывает на плотное приблизительно круглое пятно.
Когда вы закончите, выпросто отсканируйте все ячейки, чтобы проверить, является ли каждая из них частью выбранного вами раздела, чтобы создать отдельное растровое изображение.
В этом подходе, когда вы случайным образом выбираете ячейку в начале итерации, существует сильный уклон к выборубольшие разделы.Когда вы выбираете соседа, есть и уклон к выбору большего соседнего раздела.Это означает, что вы стремитесь получить один явно доминирующий шарик довольно быстро.