实现迷宫树以在DFS,BFS中使用

Implementing a tree for a maze to use in DFS, BFS

本文关键字:BFS DFS 迷宫 实现      更新时间:2023-10-16

我的程序正在从文件中获取字符数组作为输入。数组如下所示:

"#########",
"# #     #",
"# ##  # #",
"#     # #",
"### # ###",
"#   # # #",
"# # #####",
"#   #   #",
"#########",

我正在实施 DFS 和 BFS 来解决这个迷宫,从 [1,1] 开始并以 [宽度 - 1,高度 - 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 遍历树是一种可行的策略,还是我应该以另一种方式这样做?

不错的项目,我喜欢这样的事情。顺便说一下,您是否考虑过定向尝试算法(所谓的 A* 算法),我认为它对您来说会更好,尤其是在处理 2D 阵列时。在通常情况下,它比其他方法具有更好的性能,并且您不需要使用链接单元格。该算法也有某种改进,包括与"尝试方向优先"方法链接的内存。当然,您的方法没有问题,但是当您有非常巨大的矩阵要处理时,请考虑这种情况。

你的想法很好,而且很简单,但我认为你误解了带有图表的树。

首先,无需从迷宫图创建树 - 您可以在常规图上运行BFS, DFS, A* , ...

此外,并非每个迷宫都可以呈现为一棵树。

让我们看一下这个例子:

"#####",
"#   #",
"# # #",
"#   #",
"#####",

显然,迷宫中有一个循环,所以它不能呈现为一棵树。您的示例也有几个周期。