c++ - 为 DFS 求解器从数组构造树

标签 c++ arrays tree depth-first-search maze

我正在使用 DFS 制作一个迷宫求解器,我想为其实现搜索树,但我对人工智能有点陌生,我希望在这件事上得到一些帮助。

我先举一个迷宫的例子:

char maze[5][9] = 
    "#########",
    "#  #    #",
    "# ##  # #",
    "#     # #",
    "#########",

所以我的 DFS 搜索树应该是这样的:

    "#########",
    "#12#15 10 11 #",
    "#3##14 9 #12 #",
    "#456 7 8 #13 #",
    "#########",

父级的第一个子级 -> 右侧单元格(如果为空)

父级的第二个子级 -> 底部单元格(如果为空)

父级的第三个子级 -> 左单元格(如果为空)

父级的第四个子级 -> 顶部单元格(如果为空)

我的求解器将接收我的迷宫数组作为参数。我的问题是:

第一个问题:这实际上是我的 actor 访问节点的方式吗?

第二个问题:在代码中我需要将 15 声明为 10 的子级吗? (也有其他情况,例如 9 与 14)

第三个问题:当我的解算器收到数组时,我是否需要对数组进行预处理并从数组构造树,还是我的 Actor 会边构造它边做?

最佳答案

我还假设“如果节点已经在树中,则不将其包含在解决方案树中”的规则?因为这确实有帮助。

通常,树是隐式的,您只构建实际访问的树的部分,通常会在回滚时将其拆除。

您的解算器会跟踪树上的当前步骤。您可能还想跟踪您在迷宫中探索过的细胞。如果迷宫只有 # 字符,请使用 * 表示您已访问此解算器中的单元格。

您从某个位置开始。如果该位置有效,则用 * 标记它,这样您就不会再返回该位置,然后将该位置(例如 (1,1))添加到你的路径的“堆栈”。

现在,您遵循上面编写的规则。检查您当前位置下的单元格。是空的吗? (不是 #*)如果是,则递归,询问是否找到出路。

如果它找到了出路,则采用它找到的路径,在前面添加当前节点,然后返回该路径作为出路。

如果没有,则在下一个相邻单元格中搜索(按上述顺序)。

最后,用一个调用它的函数包装上面的递归例程,然后从 map 中删除 * 标记。

你行走的树是隐式编码的。构建树会迫使您访问每个节点,而您只想构建必须构建的部分。

这可以通过多种方式进行优化。您可以通过处理 map 的“幽灵”拷贝来避免写入 map 。您可以通过将堆栈传递给递归版本来避免前置,递归版本会在失败时小心地删除任何额外的节点,并在成功时保留它们。或者,您可以使用真实的堆栈,并使用包装函数向后对路径进行编码,该函数(在完成所有工作之后)反转路径,使其处于更常规的顺序。

关于c++ - 为 DFS 求解器从数组构造树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867319/

相关文章:

php - 如何多次检查一个数组是否有值

javascript - 比较两个数组并插入另一个数组错误位置的元素

python - 如何递归探索Python嵌套字典?

python - 为什么我的 root 被设置为 None?

c++ - 未声明的标识符编译错误

c++ - 如何制作基本的 FPS 计数器?

C++如何水平打印大字母?

c++ - 在 C++ 中的 SQL Server 上运行选择查询的最快方法是什么?

python - 如何从 Python 向量的特定索引列表中选择组件?

haskell - 使用 Data.Tree.Zipper 遍历玫瑰树