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

时间:2013-11-06 19:10:01

标签: c++ tree breadth-first-search depth-first-search

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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

让我们看看这个例子:

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

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