【问题标题】:Grouping of Connected Rooms or Volumes - Challenging Question连接房间或卷的分组 - 具有挑战性的问题
【发布时间】:2020-03-25 20:06:39
【问题描述】:

事实证明,这个问题比我最初想象的要难。我有一个连接房间的列表。每个房间都可以有一个关闭或打开的门。在任何给定时间,我都想知道哪些房间通过敞开的门连接在一起,并将它们标记为 Connected Rooms Group 1、Connected Rooms Group 2 等。

有一个post on 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/A 上方的单元格并将每一行视为不同的“连接房间组”来对连接的房间进行分组:

+--------+--------+--------+--------+--------+--------+
| 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]

我决定用房间和门来谈谈我的问题,但我的实际问题略有不同。在高层次上,我正在制作一个分析工具,用户可以通过打开/关闭体积之间的阀门来隔离体积。由于不同的原因,该工具需要将各个体积组合在一起,例如,直观地指示连接了哪些体积以及在每个分组体积上运行压力均衡计算。

我考虑过的用于对连接的卷进行分组的每个架构似乎都失败了。 任何出色的堆栈溢出用户都有智能解决方案来对连接的房间进行分组?

我倾向于使用 python 进行编程,但我精通多种语言。随意从概念上或通过您最喜欢的非古老语言回答问题。

【问题讨论】:

  • 对于那些将来会关注这个话题的人。我还在使用 python 的连接组件上找到了helpful article。 :)

标签: python algorithm matrix


【解决方案1】:

我相信您在这里所做的是在adjacency matrix 中寻找connected components。你的房间是节点,如果它们是连接的,它们共享一条边。

这里有一个link to some pseudo code,该算法应该以 DFS 和 BFS 方式解决您的问题。

【讨论】:

  • 这看起来正是我所需要的。谢谢!
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多