【问题标题】:maze solver in C++ [closed]C ++中的迷宫求解器[关闭]
【发布时间】:2013-11-06 17:53:33
【问题描述】:

我使用深度优先搜索创建了一个迷宫生成器,它返回一个磅和空格数组来指示迷宫。示例:

char maze[height][width] =
{
    "#########",
    "#   #   #",
    "# ### # #",
    "# #   # #",
    "# # # ###",
    "#   # # #",
    "# ### # #",
    "#   #   #",
    "#########",
};

代理将始终从左上角 (maze[1][1]) 开始并从右下角 (maze[7][7]) 退出。

我正在尝试使用深度优先搜索来制作求解器。

问题是我是一个初学者到中级程序员,所以我很难理解如何在 C++ 中实现深度优先搜索,而且我在迷宫中实现它的难度更大。

我对堆栈、队列等有基本的了解。我也知道 DFS 在树中是如何工作的(理论上差不多),但我的主要问题是如何在存储在 2D 中的迷宫中实现它数组。

我想专门学习 DFS,这样我就可以开始了,然后我将实施其他搜索策略(例如 BFS)来开始接触 AI。

编辑:我不想要现成的代码!!!我希望您帮助我了解如何将伪代码转换为 C++ 进行迷宫!

【问题讨论】:

  • 什么?不!我想知道如何在 C++ 上使用这个,因为我很困惑!
  • 是的,但这基本上就是您要说的...我的意思是,您只是列出了您的要求并说“请帮忙”。
  • “所以我很难理解如何在 C++ 中实现深度优先搜索” 我需要帮助来理解如何实现它。我不希望其他人为我实现它。
  • 嗯,你有没有尝试过任何东西?我的意思是,谷歌搜索“dfs”并不难
  • @ᴋᴇʏsᴇʀ 我已经很清楚如何表示代理的位置,如何移动他等等,但我的问题主要是如何使用堆栈来跟踪哪个位置代理已经。根据我在谷歌中的发现,有些人保留了一堆访问过的地方,但我从来没有真正理解什么时候从堆栈中删除位置,这是我最大的困惑

标签: c++ arrays artificial-intelligence depth-first-search maze


【解决方案1】:

所以深度优先搜索的基本操作是:

这对任何任意图的工作方式与对树的工作方式相同。树只是一个特例。你甚至可以把你的迷宫想象成一棵树:

#########
#123#   #
#4### # #
#5#   # #
# # # ###
#   # # #
# ### # #
#   #   #
#########

在树上使用此算法与在任意图上使用此算法的唯一区别在于,由于树的层次结构,它隐含地知道树中的哪些节点已被访问。对于任意图,您可能具有如下结构:

#####
#187#
#2#6#
#345#
#####

在检查节点 8 时,您不想将节点 1 视为新的访问地点。

在您的迷宫中,记住已访问过哪些节点的一种方法是在遇到它们时立即用'#' 填充它们。


我几乎已经弄清楚了如何表示代理的位置,如何移动他等等,但我的问题主要是如何使用堆栈来跟踪代理的位置。根据我在 google 中的发现,有些人保留了一堆访问过的地方,但我从来没有真正理解何时从堆栈中删除位置,这是我最大的困惑

堆栈本身不用于跟踪访问过的地方。它只跟踪当前穿过迷宫的“路径”。当您到达死胡同时,节点会从堆栈中删除;这些节点必须保持标记为已访问,即使它们已从堆栈中删除。如果删除这些节点也会导致这些节点“未访问”,那么您的搜索可能会不断尝试并重试死胡同。


我建议你先画出几个小迷宫,然后按照上面的流程图手工穿过它们。这将使您更好地理解算法。以下是一些示例迷宫:

Start at O, finish at X

####    #####      #####     #####
#OX#    #O X#      #O#X#     #O  #
####    #####      #####     # #X#
                             #####

然后考虑流程图中的每个框,并思考它使用什么数据,如何表示该数据,以及如何使用该数据在代码中实现框的操作。

【讨论】:

  • 非常感谢,这真的很有帮助,尤其是流程图让我明白了如何实现这一点。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多