簡體   English   中英

將數組轉換為節點

[英]Convert array to nodes

首先,我要說我對節點和圖有非常基本的了解。

我的目標是為存儲為數組的迷宮制作求解器。 我確切地知道如何實現求解算法(實際上我正在實現其中的幾個),但是我的問題是,我對如何實現求解器將在每個空單元格中使用的節點感到非常困惑。

這是一個示例數組:

char maze[5][9] = 
        "#########",
        "#  #    #",
        "# ## ## #",
        "#     # #",
        "#########"

我的求解器從左上方開始,解決方案(退出)在右下方。

我已經閱讀了有關節點如何工作以及如何實現圖的知識,所以我認為我需要這樣做:

  • 起點將成為一個節點
  • 每個節點將具有列和行號作為屬性
  • 每個節點還將具有訪問狀態作為屬性
  • 訪問狀態可以被visited ,被visited and leads to dead endnot 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連接兩個_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM