最近我遇到了一个编码问题,要求你在给定的图表上找出有多少不同的"关闭"有子图。在找到之后,您需要搜索每个子图并找出每个子图中有多少元素。所以现在要定义子图。让我们说我们已经给出了
.#####.
#.....#
#.E##.#
#.#.#.#
#.#####
#E..#E#
.#####.
将它想象成迷宫,其中圆点表示移动空间,而标签是墙壁,您可以水平或垂直移动。所以,让我们说你在图中的某一点。通过水平或垂直移动可以达到的所有点都是特定的一部分"关闭"子图。因此,对于给定的示例,我们有3"关闭"子图
1#####1
#11111#
#11##1#
#1#2#1#
#1#####
#111#3#
1#####3
第一个子图中还有2个元素,第二个子元素中没有元素,第三个元素中没有元素。
我想你使用的搜索方法并不重要,所以我从行中第一个输入的点开始使用BFS。因此,一旦我从该特定点开始到达所有可能的点,我就找到了一个子图,并且我已经计算了子图中有多少元素。但现在的问题是如何找到下一个子图的起点。我想不出另一种方法,而不是迭代图,直到你找到一个非访问点,并重复应用BFS,直到你访问了所有的点。但是这种方法太费时间了,所以有什么方法可以有效地找到子图吗?例如,当您进入该行时,是否有一种方法可以从队列中的每个子图堆叠至少一个点?
答案 0 :(得分:1)
不是迭代整个图形来查找非访问点,而是可以尝试迭代与已知子组相邻的墙,并查找与这些墙相邻的非访问点。您可以在bfs期间编译墙列表。
答案 1 :(得分:0)
您可以先迭代图表并查找所有可能的"起点",将这些元素保存在set数据结构中,当您执行BFS时 - 对于您找到的每个点 - 删除它来自入口点。
现在,在每次迭代中 - 您所要做的就是从集合中选择一个随机入口点(保证尚未访问),然后执行新的BFS。