6

我的程序将 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 遍历树是否是一种可行的策略,或者我应该以另一种方式进行?

4

2 回答 2

3

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

于 2013-11-06T20:22:00.813 回答
1

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

首先,不需要从迷宫图创建树 - 您可以BFS, DFS, A* , ...在一般图上运行。

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

让我们看一下这个例子:

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

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

于 2013-11-24T12:35:11.100 回答