我的程序将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遍历树是否是一种可行的策略,或者我应该采用另一种方式?
答案 0 :(得分:3)
好项目,我喜欢这样的事情。那么你是否考虑过定向尝试算法(所谓的A *算法)我认为它会更好,特别是在处理2D数组时。在通常情况下,它比其他方法具有更好的性能,并且您不需要使用链接的单元格。该算法也有一些改进,包括与“尝试方向优先”方法相关联的存储器。当然,你的方法没有问题,但考虑到你需要处理巨大矩阵的情况。
答案 1 :(得分:1)
你的想法很好而且非常简单,但我认为你用图表误解了树。
首先,无需从迷宫图创建树 - 您可以在常规图上运行BFS, DFS, A* , ...
。
此外,并非每个迷宫都可以呈现为一棵树。
让我们看看这个例子:
"#####",
"# #",
"# # #",
"# #",
"#####",
显然迷宫中有一个循环,所以它不能呈现为树。你的例子也有几个周期。