Я пытаюсь создать маленького roguelike-а и зашел так далеко, что генерировал случайные комнаты и коридоры. Каждая комната является экземпляром объекта и содержит массив других комнат, соединенных коридором.
Я могу выделить комнаты, не связанные между собой, но как узнать, какие комнаты связаны только друг с другом, но не с большинством других, образуя остров?
Чтобы проиллюстрировать лучше, проблема здесь - изображение с консоли на заболоченном уровне. Номера 5 и 6 связаны только друг с другом. Какой алгоритм я могу использовать, чтобы обнаружить это?
Ответы:
Начните с полного списка номеров. Выберите стартовую комнату. Перейдите из этой комнаты во все связанные комнаты. Для каждой комнаты вы посещаете, удалить его из списка комнат и добавить его в список А . После того, как вы посетили все соединения, все номера , оставшиеся в списке не подключены к исходной комнате или любому из комнат на список А .
Затем вы можете продолжить, выбрав комнату из того, что осталось от полного списка, и снова перейдя. На этот раз при добавлении в список B . Продолжайте этот процесс, пока у вас не останется больше комнат в первоначальном списке. Теперь у вас есть списки всех подключенных наборов комнат.
Такие проблемы легко адаптируются к задачам теории графов. Например, проблема, которую вы описали выше, напрямую связана с подключением .
источник
Ваша коллекция комнат - это, по сути, график, и ваша проблема сводится к поиску связанных компонентов («островков») в этом графике.
Простой способ найти связанные компоненты - выполнить BFS (поиск в ширину) из каждой вершины. Выполнение BFS из вершины A даст вам все вершины в связанном компоненте, которому принадлежит вершина A.
Итак, в основном вы начинаете с произвольной вершины, делаете BFS и помечаете каждую встреченную вершину как член 1-го «острова». Затем вы переходите к следующей немаркированной вершине и снова делаете BFS, на этот раз помечая встреченные вершины как членов 2-го «острова», и так далее.
источник
Вы можете изобразить комнаты как вершины на ориентированном графе . Сделав это, вы сможете применять хорошо известные алгоритмы для решения вашей проблемы.
Алгоритм Дейкстры , например, создает дерево кратчайших путей для заданной начальной вершины графа. Это дерево будет содержать все достижимые вершины из начальной точки. Затем вы можете сделать вывод, что вершины, отсутствующие в дереве, являются частью других островов. Вы можете применить алгоритм к этим вершинам, чтобы получить деревья, представляющие каждый остров.
источник