有了彼此连接的房间列表,如何找到孤立的房间组?


9

我正在尝试创建一个小型的roguelike,并延伸到随机生成的房间和走廊。每个房间都是实例对象,并包含通过走廊连接的其他房间的数组列表。

我可以挑出未连接的房间,但是我怎么知道仅相互连接但不与大多数其他房间相连的房间呢?

为了更好地说明问题,这里是来自控制台的图像,处在一个陷井状态。房间5和6仅相互连接。我可以使用什么算法来检测?

在此处输入图片说明


使用图像有问题吗?该pastebin链接将仅持续一个月。
MichaelHouse

是的,起初我不太了解您在这里做了什么。抱歉,我还原了您的更改。
petervaz 2012年

1
您为什么不构造它,以便一开始就没有单独的房间?还是您想要孤立的集合?
2012年

就像我在下面的另一条评论中所说的,@ AlbeyAmakiir,我会反复尝试分别生成房间,直到填满地图,然后我运行例程进行连接,然后再运行另一个连接这些岛屿。我知道它可能太令人费解,但无法找到其他方法。
petervaz 2012年

Answers:


14

从完整的房间列表开始。选择一个起居室。从该房间导航到所有连通的房间。对于您访问的每个房间,将其从房间列表中删除,并将其添加到列表A中。访问完所有连接后,列表中剩余的任何房间都不会连接到起始房间或列表A中的任何房间。

然后,您可以从完整列表的其余部分中选择一个房间,然后再次导航,以继续。这次添加到列表B中。继续此过程,直到原始列表上没有更多房间为止。现在,您具有所有已连接房间集的列表。

这样的问题很容易适应图论问题。例如,您上面描述的问题直接与连接有关


1
任何搜索树算法都应该起作用。那或者您可以更改生成算法来避免此问题。如果您更改生成算法,只需生成随机数量的房间(附加到您的起始房间),然后随机数量的房间(附加到以下每个房间),则可以在现有房间之间添加一些随机连接,以通过快捷方式来增加一些趣味性等等。我个人只是做一个搜索树算法。
本杰明·丹格·约翰逊

这是很合逻辑的。我一定累了 谢谢你的帮助。会尽快接受。
彼得瓦兹,2012年

@BenjaminDangerJohnson您的评论似乎更适合这个问题,而不是这个答案。
MichaelHouse

@petervaz没问题。我想我的CS学位毕竟有用。
MichaelHouse

@BenjaminDangerJohnson我的生成算法只是随机放置房间,直到填满空间并在以后寻找连接。= P在尝试更改创建之前,将尝试修复连接。
petervaz 2012年

9

您的房间集合实质上是一个图,并且您的问题归结为在该图中找到连接的组件 s(“岛”)。

查找连接的组件的一种简单方法是从每个顶点进行BFS(宽度优先搜索)。从顶点A执行BFS将获得顶点A所属的连接组件中的所有顶点。

因此,基本上,您可以从任意顶点开始,执行BFS,并将遇到的每个顶点标记为第一“岛”的成员。然后,移至下一个未标记的顶点并再次执行BFS,这次将遇到的顶点标记为第二“岛”的成员,依此类推。


4

您可以将房间描绘为有向图上的顶点。这样,您将能够应用众所周知的算法来解决您的问题。

Dijkstra的算法,例如,为图形上给定的起始顶点生成最短路径树。该树将包含从起点开始的所有可达顶点。然后,您可以推断出树中不存在的顶点是其他岛的一部分。您可以将算法应用于这些顶点,以获得代表每个岛屿的树木。


1
甚至是无向图也可以做到这一点...除了您只有一种途径而已。
Aron_dc 2012年

@Aron_dc,您是对的,您可以将房间描绘为无向图上的顶点,并使用Kruskal算法获得相似的结果。我只是建议将其描绘为有向图,因为petervaz表示连接的方式-即Room 1> 3
Asakeron 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.