将阵列转换为节点
Convert array to nodes
首先,我要说的是,我对节点和图有非常基本的了解。
我的目标是为存储为数组的迷宫制作求解器。我确切地知道如何实现求解算法(我实际上正在实现其中的几个),但我的问题是,我对如何实现求解器将在每个空单元格中使用的节点感到非常困惑。
下面是一个示例数组:
char maze[5][9] =
"#########",
"# # #",
"# ## ## #",
"# # #",
"#########"
我的求解器从左上角开始,解决方案(退出)在右下角。
我已经阅读了节点如何工作以及如何实现图形,所以这是我认为我需要这样做的方式:
- 起点将成为节点
- 每个节点将具有列和行号作为属性
- 每个节点还将具有访问状态作为属性
- 访问状态可以是
visited
、visited and leads to dead end
、not visited
每次访问节点 - 时,每个直接相邻的、空的和未访问的单元都将成为被访问节点的子节点
- 每个访问过的节点都会被放在 solutionPath 堆栈的顶部(并在地图上标记为"*")
- 每个导致死胡同的节点都会从堆栈中删除(并在地图上标记为"~")
成品迷宫示例:
"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"
基本上我的问题是,我在这里用我的思维方式做了一些非常愚蠢的事情(因为我对节点真的没有经验),如果是,你能向我解释为什么吗?此外,如果可能的话,为我提供其他网站来检查哪些在实际应用程序上实现了图形示例,以便我可以更好地掌握它。
答案实际上取决于您认为问题中最重要的是什么。如果您正在寻找效率和速度 - 您正在添加太多节点。不需要那么多。
高效的方法
求解器只需要路径起点和终点以及地图上每个可能角落的节点。喜欢这个:
"#########",
"#oo#o o#",
"# ## ## #",
"#o oo#o#",
"#########"
没有必要测试地图上的其他地方 - 你要么必须穿过它们,要么甚至不需要费心测试。
如果它对您有帮助 - 我有一个模板digraph
类,我为简单的图形表示而设计。它写得不是很好,但它非常适合展示可能的解决方案。
#include <set>
#include <map>
template <class _nodeType, class _edgeType>
class digraph
{
public:
set<_nodeType> _nodes;
map<pair<unsigned int,unsigned int>,_edgeType> _edges;
};
我使用这个类来使用 Dijkstra 算法在塔防游戏中找到一条路径。对于任何其他算法,表示应该足够。
节点可以是任何给定的类型 - 您可能最终会使用 pair<unsigned int, unsigned int>
._edges
通过集合中的position
连接两个_nodes
。
易于编码的方法
另一方面 - 如果您正在寻找一种易于实现的方法 - 您只需要将数组中的每个可用空间视为可能的节点。如果这就是你要找的 - 没有必要设计一个图形,因为数组以完美的方式表示问题。
您不需要专门的类来以这种方式解决它。
bool myMap[9][5]; //the array containing the map info. 0 = impassable, 1 = passable
vector<pair<int,int>> route; //the way you need to go
pair<int,int> start = pair<int,int>(1,1); //The route starts at (1,1)
pair<int,int> end = pair<int,int>(7,3); //The road ends at (7,3)
route = findWay(myMap,start,end); //Finding the way with the algorithm you code
其中findWay
有一个vector<pair<int,int>> findWay(int[][] map, pair<int,int> begin, pair<int,int> end)
的原型,并实现你想要的算法。在函数内部,您可能需要另一个 bool 类型的二维数组,它指示测试了哪些位置。
当算法找到一条路线时,你通常必须反向读取它,但我想这取决于算法。
在您的特定示例中,myMap 将包含:
bool myMap[9][5] = {0,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,1,0,
0,1,0,0,1,0,0,1,0,
0,1,1,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,0};
findWay
会返回一个包含(1,1),(1,2),(1,3),(2,3),(3,3),(4,3),(4,2),(4,1),(5,1),(6,1),(7,1),(7,2),(7,3)
的vector
- 如何将节点 V8 字符串转换为 C++ 字符串
- 没有从"树节点"到"树节点*"的可行转换
- 将节点数组(可变长度)转换为常量浮点**以调用opencv.calcHist
- 正在初始化:无法从'_Ty*'转换为 List<int,std::分配器<节点<T>>>:节点*
- 错误:无法从节点*转换为节点 c++?
- 指针取消引用:无法将“节点**”转换为“节点*”
- 无法将参数从"this"转换为节点<T>*
- 用指针 *将C 转换为JavaScript(节点)
- 如何将XML节点数据转换为QT中的字符串
- 如何将节点插件持久<function>转换为本地<function>?
- 在从通用树转换的二进制树中查找节点的父
- 如何使用指针C++将类的析构函数转换为另一个类?类似于单向列表容器类和节点类
- 将阵列转换为节点
- 转换为模板类(节点)
- 如何将列表'node_ptr'转换为我自己的节点类型
- 错误 C2440:"=":无法从"列表节点 *"<T>转换为"列表节点<T> *"
- 在C++中实现图形节点时将 C# 类转换为C++
- 无法在赋值中将"列表节点**"转换为"列表节点*"
- 用于c++的XML解析器,它将XML节点转换为c++对象
- C++中的树实现:无法将节点转换为节点*