Як знайти список кімнат, що мають зв’язок один з одним, як я можу знайти окремі групи номерів?


9

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

Я можу виділити непоєднані кімнати, але як я можу знати кімнати, які з'єднані лише один з одним, але не з більшістю інших, утворюючи острів?

Щоб краще проілюструвати проблему, тут є зображення з консолі на затопленому рівні. Кімнати 5 і 6 з'єднані тільки один з одним. Який алгоритм можна використовувати для виявлення цього?

введіть тут опис зображення


Проблема з використанням зображення? Це посилання на пастібін триватиме лише місяць.
MichaelHouse

Так, я спочатку не зовсім зрозумів, що ти тут робив. Вибачте, я змінив вашу зміну.
petervaz

1
Чому б ти не побудував це так, щоб в першу чергу не було жодних окремих кімнат? Або ви хочете, щоб там були поодинокі набори?
AlbeyAmakiir

@AlbeyAmakiir, як я вже говорив в іншому коментарі нижче, я генерую кімнати окремо методом проб і помилок, поки я не заповнять карту, лише тоді я запускаю процедуру підключення, а потім запускаю інший, щоб з'єднати ці острови. Я знаю, що це, мабуть, занадто перекручено, але не могла зрозуміти іншого шляху.
petervaz

Відповіді:


14

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

Потім можна продовжити, вибравши номер із залишків повного списку та знову перейшовши. На цей раз при додаванні в список B . Продовжуйте цей процес, поки у вас не буде більше номерів у вихідному списку. Тепер у вас є списки всіх підключених наборів кімнат.

Такі проблеми легко адаптуються до задач теорії графіків. Наприклад, описана вище проблема безпосередньо стосується підключення .


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

Це дуже логічно. Я, мабуть, втомився. Спасибі за вашу допомогу. Прийму, як тільки це дозволить.
petervaz

@BenjaminDangerJohnson Ваш коментар видається більш підходящим для питання, а не для цієї відповіді.
MichaelHouse

@petervaz Немає проблем. Я здогадуюсь, мій ступінь CS все-таки має користь.
MichaelHouse

@BenjaminDangerJohnson мій алгоритм генерації - це просто розміщення випадкових кімнат, поки не заповнить простір і шукати зв'язки пізніше. = P Спробуємо виправити з'єднання, перш ніж вдаватися до зміни творіння.
petervaz

9

Ваша колекція номерів по суті є графіком, і ваша проблема зводиться до пошуку з’єднаних компонентів s ("островів") у цьому графіку.

Найпростіший спосіб знайти з'єднані компоненти - це виконати BFS (пошук в ширину) з кожної вершини. Виконуючи BFS з вершини A, ви отримаєте всі вершини в з'єднаному компоненті, до якого належить вершина A.

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


4

Ви можете зображати кімнати у вигляді вершин на спрямованому графіку . Роблячи це, ви зможете застосувати добре відомі алгоритми для вирішення своєї проблеми.

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


1
Навіть непрямий графік міг би це зробити ... за винятком того, що у вас є тільки маршрути в одну сторону.
Aron_dc

@Aron_dc, ви праві, ви можете зображати кімнати у вигляді вершин на непрямому графіку та отримувати подібні результати, використовуючи алгоритм Крускала. Я просто запропонував зобразити це як спрямований графік через те, як петерваз представляв з'єднання - тобто, кімната 1> 3
Асакерон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.