为迷宫实现树以在 DFS、BFS 中使用
Posted
技术标签:
【中文标题】为迷宫实现树以在 DFS、BFS 中使用【英文标题】:Implementing a tree for a maze to use in DFS, BFS 【发布时间】:2013-11-18 04:44:51 【问题描述】:我的程序将 char 数组作为文件的输入。数组如下所示:
"#########",
"# # #",
"# ## # #",
"# # #",
"### # ###",
"# # # #",
"# # #####",
"# # #",
"#########",
我正在实施 DFS 和 BFS 来解决这个从 [1,1] 开始并以 [width - 1,height - 1] 结束的迷宫。
我想制作一棵树来代表迷宫,然后分别使用每种算法遍历树。
我将从每一行开始扫描空单元格,在每个空单元格处,其右侧、左侧和底部的每个单元格都将成为该单元格的子单元格。它看起来像这样:
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
if (isEmpty(maze[i][j]))
putChildren(maze[i-1][j], maze[i][j+1], maze[i+1][j]);
//this will check if it's a wall first
像这样实现树然后用它用 DFS 和 BFS 遍历树是一种可行的策略吗?还是我应该换一种方式?
【问题讨论】:
你使用什么语言? C++(我会编辑) 【参考方案1】:不错的项目,我喜欢这样的东西。顺便说一句,您是否考虑过定向尝试算法(所谓的 A* 算法),我认为这对您来说会更好,尤其是在处理 2D 数组时。它在通常情况下比其他方法具有更好的性能,并且您不需要使用链接单元格。该算法也有一些改进,包括与“尝试方向优先”方法相关的内存。当然,你的方法没有问题,但是当你有非常巨大的矩阵要处理时,请考虑情况。
【讨论】:
我实际上计划稍后实施 A*,但首先我想实施 DFS 和 BFS。我非常想实现所有这些来锻炼我的思维并熟悉它们以及人工智能。 我在人工智能领域工作了很多,如果我能给你提示,没有解决问题的好方法。您需要做的是准备面对可能需要两种算法来实现和选择更好的情况(在问题分析之后)。尽管如此,为了使迷宫求解器尽可能好,您应该允许您的实施“感知”环境。还可以考虑制作二维(带有“已访问”布尔标志)数组而不是图形。在某些情况下它更容易,在某些情况下更难,但它比通常的图表更值得实现) 下一个,即使你在使用graph,使用visited标志,如果你发现死路,你可以把它们抹掉。 Ue 贪心算法,它将找到你最快的解决方案并返回它。还有一个很好的算法(但必须实现),称为洪水填充房间标记。您应该假设房间之间有通道,并且只标记树中的那些通道,以及“开始”和“结束”,洪水填充将只考虑可通过的方式,并且应该丢弃任何步伐,如开放房间或死胡同。 【参考方案2】:您的想法很好,也很简单,但我认为您误解了带有图表的树。
首先,不需要从迷宫图创建树 - 您可以在一般图上运行 BFS, DFS, A* , ...
。
此外,并非每个迷宫都可以呈现为一棵树。
我们来看例子:
"#####",
"# #",
"# # #",
"# #",
"#####",
显然迷宫中有一个循环,所以它不能呈现为一棵树。您的示例也有几个周期。
【讨论】:
以上是关于为迷宫实现树以在 DFS、BFS 中使用的主要内容,如果未能解决你的问题,请参考以下文章