【发布时间】:2013-11-09 22:11:45
【问题描述】:
首先我要说我对节点和图有非常基本的了解。
我的目标是为一个存储为数组的迷宫创建一个求解器。我确切地知道如何实现求解算法(我实际上正在实现其中的几个),但我的问题是,我对如何实现求解器将在每个空单元格中使用的节点感到非常困惑。
这是一个示例数组:
char maze[5][9] =
"#########",
"# # #",
"# ## ## #",
"# # #",
"#########"
我的求解器从左上角开始,解决方案(退出)在右下角。
我已经阅读了有关节点如何工作以及如何实现图表的信息,所以我认为我需要这样做:
- 起点会变成一个节点
- 每个节点都有列和行号作为属性
- 每个节点还将具有访问状态作为属性
- 访问状态可以是
visited,visited and leads to dead end,not visited - 每次访问节点时,每个直接相邻、空且未访问的单元格都会成为访问节点的子节点
- 每个访问过的节点都被放在解决方案路径堆栈的顶部(并在地图上标记为“*”)
- 导致死路的每个节点都从堆栈中删除(并在地图上标记为“~”)
完成的迷宫示例:
"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"
基本上我的问题是,我在这里用我的思维方式做了一些非常愚蠢的事情吗(因为我对节点真的没有经验)如果是的话,请你解释一下为什么?此外,如果可能的话,请提供其他网站来检查哪些实现了实际应用程序中的图表示例,以便我更好地掌握它。
【问题讨论】:
-
迷宫中的每个开放(即非墙)位置都是一个节点。每个节点都应该有到它的邻居的边。一旦您将二维数组表示转换为通用图结构,您应该能够在其上实现您希望的任何图遍历算法。您可以通过多种方式对此进行优化(例如使用加权图),但这应该可以帮助您入门。
-
我不打算对整个迷宫进行预处理,因为这样我会访问每个单元格,即使我不必这样做。我正在考虑制作节点。
-
我想预处理不是必要的,但是根据你用来遍历迷宫的算法,它可能想知道有多少个节点先验。例如,大多数 Djisktra 算法的公式都假设您在开始时有一组节点和边。您的图形实际上以网格形式隐式表示,每个开放点都有节点,相邻开放点之间有边。如果您了解该映射并将其构建到代码中,您应该能够在此表示上实现您想要的任何图形算法。
-
FWIW,很久以前我写了一个直接在网格表示上工作的 BFS 实现。它甚至没有谈论节点和边缘,但这实际上就是它正在做的事情。你可以在这里找到它:spatula-city.org/~im14u2c/mso_contest/contest_9 节点-边缘关系被嵌入到代码中:当访问迷宫中的一个单元格时,它“知道”该单元格与其空间邻居相连。没有显式的边缘,只有隐式的。
标签: c++ arrays graph artificial-intelligence nodes