[英]Convert array to nodes
首先,我要說我對節點和圖有非常基本的了解。
我的目標是為存儲為數組的迷宮制作求解器。 我確切地知道如何實現求解算法(實際上我正在實現其中的幾個),但是我的問題是,我對如何實現求解器將在每個空單元格中使用的節點感到非常困惑。
這是一個示例數組:
char maze[5][9] =
"#########",
"# # #",
"# ## ## #",
"# # #",
"#########"
我的求解器從左上方開始,解決方案(退出)在右下方。
我已經閱讀了有關節點如何工作以及如何實現圖的知識,所以我認為我需要這樣做:
visited
,被visited and leads to dead end
, not visited
成品迷宮的示例:
"#########",
"#*~#****#",
"#*##*##*#",
"#****~#*#",
"#########"
基本上,我的問題是,我在這里用我的思維方式做的事真的很愚蠢(因為我對節點真的沒有經驗),如果可以,請向我解釋原因? 另外,如果可能,請提供其他網站,以檢查在實際應用程序中實現了圖形示例的網站,以便我可以更好地掌握它。
答案確實取決於您發現問題中最重要的內容。 如果您正在尋找效率和速度 -您添加的節點太多了。 不需要那么多。
您的求解器僅需要路徑起點和終點以及地圖上每個可能角點的節點。 像這樣:
"#########",
"#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
連接兩個_nodes
通過他們的position
在集合。
另一方面,如果您正在尋找一種易於實現的方法,則只需將數組中的每個可用空間都視為一個可能的節點。 而且,如果這就是您要尋找的-則無需設計圖形,因為數組可以完美地表示問題。
您不需要專用的類來解決此問題。
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)
的原型,其中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
將返回一個vector
含(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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.