Эта проблема оказалась сложнее, чем я думал. У меня есть список подключенных комнат. Каждая из комнат может иметь закрытую или открытую дверь. В любой момент я хотел бы знать, какие комнаты соединены вместе через открытые двери, и пометить их как «Связанные комнаты 1», «Связанные комнаты 2» и т. Д. c.
В stackoverflow есть сообщение , в котором обсуждается, как генерировать случайно соединенные комнаты и отслеживать, какие комнаты подключены. В основном определяют матрицу / массив conn[a][b]
. Затем вы можете заполнить массив значениями true или false, если комната подключена. Так что если комнаты 2 и 4 соединены, то conn[2][4] = true
и аналогично conn[4][2] = true
. Матрица будет выглядеть следующим образом:
+--------+--------+--------+--------+--------+
| Rooms | Room 1 | Room 2 | Room 3 | Room 4 |
+--------+--------+--------+--------+--------+
| Room 1 | N/A | false | false | false |
| Room 2 | false | N/A | false | true |
| Room 3 | false | false | N/A | false |
| Room 4 | false | true | false | N/A |
+--------+--------+--------+--------+--------+
Более сложная ситуация может быть следующей (комната 2 и комната 3 имеют закрытую дверь):
+----+----+----+
| R1 R2 | R3 |
+ +----+ +
| R5 | | R4 |
+----+ +----+
Матрица будет выглядеть как следующее:
+--------+--------+--------+--------+--------+--------+
| Rooms | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A | true | false | false | true |
| Room 2 | true | N/A | false | false | false |
| Room 3 | false | false | N/A | true | false |
| Room 4 | false | false | true | N/A | false |
| Room 5 | true | false | false | false | N/A |
+--------+--------+--------+--------+--------+--------+
Я думал, что у меня есть умная идея, сгруппировав связанные комнаты, просматривая только ячейки, расположенные над N / As, и обрабатывая каждый ряд как отдельную 'Группу связанных комнат ':
+--------+--------+--------+--------+--------+--------+
| Rooms | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A | true | false | false | true |
| Room 2 | | N/A | false | false | false |
| Room 3 | | | N/A | true | false |
| Room 4 | | | | N/A | false |
| Room 5 | | | | | N/A |
+--------+--------+--------+--------+--------+--------+
даст:
Connected Group 1: [1, 2, 5]
Connected Group 2: [3, 4]
Однако этот метод не работает для более сложных ситуаций (Соединение комнат 4 и 5):
+----+----+----+
| R1 R2 | R3 |
+ +----+ +
| R5 R4 |
+----+----+----+
Матрица:
+--------+--------+--------+--------+--------+--------+
| Rooms | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A | true | false | false | true |
| Room 2 | | N/A | false | false | false |
| Room 3 | | | N/A | true | false |
| Room 4 | | | | N/A | true |
| Room 5 | | | | | N/A |
+--------+--------+--------+--------+--------+--------+
даст:
Connected Group 1: [1, 2, 5]
Connected Group 2: [3, 4]
Connected Group 3: [4, 5]
Принимая во внимание, что фактический объем будет связан, так что должен быть только один Connected Group 1: [1,2,3,4,5]
I Я решил рассказать о своей проблеме, используя комнаты и двери, но моя настоящая проблема немного отличается. На высоком уровне я делаю инструмент анализа, где пользователь может изолировать объемы, открывая / закрывая клапан между объемами. Инструмент должен группировать отдельные объемы вместе по разным причинам, таким как визуальное указание подключенных объемов и выполнение расчетов выравнивания давления для каждого из сгруппированных объемов.
Кажется, что каждая схема, о которой я думал для группировки подключенных томов, дает сбой. У каких-нибудь блестящих пользователей переполнения стека есть интеллектуальное решение для группировки подключенных комнат?
Я полагаюсь на программирование этого в python, но я хорошо владею несколькими языками. Не стесняйтесь ответить на вопрос концептуально или через ваш любимый не-archai c язык.