C ++中的迷宫求解器

时间:2013-11-06 17:53:34

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

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

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

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

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

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

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

我想特别学习DFS,所以我可以开始,然后我将实施其他搜索策略(例如BFS)来开始接触AI。

编辑:我不想准备好代码!我希望你能帮我理解如何将伪代码转换为C ++用于迷宫!

1 个答案:

答案 0 :(得分:2)

因此深度优先搜索的基本操作是:

Depth first search flowchart

对于任意图形和树都可以使用相同的图形。树只是一个特例。您甚至可以将您的迷宫视为一棵树:

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

Tree

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

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

在检查节点8时,您不希望将节点1视为要访问的新位置。

使用迷宫,一种方法可以记住访问过哪些节点,只要遇到它们就会用'#'填充它们。


  

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

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


我建议你先画一些小迷宫,然后用上面的流程图手工走过去。这将使您更好地理解该算法。以下是一些示例迷宫:

Start at O, finish at X

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

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