簡體   English   中英

C ++遞歸深度優先搜索迷宮算法以及現在要去哪里?

[英]C++ Recursive depth-first search maze algorithm and where to go now?

我一直在嘗試使用遞歸深度優先搜索樣式算法來計算迷宮生成器。 我知道過去已經做過很多次了,但是根據我自己的理解,我一直在嘗試自己重新實現它,以便更好地理解它。

因此,這是我到目前為止的嘗試。

#include <iostream>
#include <vector>
#include <algorithm>
#include <unistd.h>

struct vertex {
    int x;
    int y;
};

int main(int argc, char **argv)
{
    // Init the map
    int map_size = 24;
    int half_point = map_size / 2;

    int map[map_size+1][map_size+1];    

    for(int y = 0; y < map_size+1; y++) {
        for(int x = 0; x < map_size+1; x++) {
            map[x][y] = 0;
        }
    }

    vertex start;
    start.x = half_point;
    start.y = half_point;

    std::vector<vertex> history;

    // Set start point as visited
    history.push_back(start);
    while( !history.empty() ) {

        vertex v = history.back();

        map[v.x][v.y] = 1;

        // Calculate the directions for each vertex
        vertex N;        N.x = v.x+1;        N.y = v.y;
        vertex S;        S.x = v.x-1;        S.y = v.y;
        vertex E;     E.x = v.x;       E.y = v.y-1;
        vertex W;    W.x = v.x;     W.y = v.y + 1;

        bool can_north = false;  bool can_south = false;  bool can_east = false;   bool can_west = false;

        // Check north and add if relevant
        if( N.x >= 0 && N.x <= map_size && N.y >= 0 && N.y <= map_size && map[N.x][N.y] == 0 ) {  can_north = true; }
        // Check south and add if relevant
        if( S.x >= 0 && S.x <= map_size && S.y >= 0 && S.y <= map_size && map[S.x][S.y] == 0 ) {   can_south = true;   }
        // Check east and add if relevant
        if( E.x >= 0 && E.x <= map_size && E.y >= 0 && E.y <= map_size && map[E.x][E.y] == 0 ) {  can_east = true;  }
        // Check west and add if relevant
        if( W.x >= 0 && W.x <= map_size && W.y >= 0 && W.y <= map_size && map[W.x][W.y] == 0 ) {  can_west = true;  }

        std::vector<vertex> available;
        if(can_north) { available.push_back(N); }
        if(can_south) { available.push_back(S); }
        if(can_east) { available.push_back(E); }
        if(can_west) { available.push_back(W); }

        // Select random element from availables 
        if( !available.empty() )
        {
            std::random_shuffle( available.begin(), available.end() );
            vertex aV = available.back();

            history.push_back(aV);

            available.clear();
        } else {
            if( !history.empty() ) {
                history.pop_back();
            }
        }

        // Animate the output to the console
        system("clear");
        for(int y = 0; y < map_size+1; y++) {
            for(int x = 0; x < map_size+1; x++) {
                std::cout << map[x][y] << ", ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;

        usleep(5000);
    }

    return 0;
}

每次在顯示更新以顯示其經過的路徑的基本動畫之前,都在其中使用Linux系統調用來清除終端。

我不知道並且想了解的是... 1)這實際上是遞歸的深度優先搜索算法嗎?

如果是這樣,那么至少我已經正確理解了這個概念。

2)我將如何將其繪制到圖像文件?

我會回答你的第一個問題

這實際上是遞歸的深度優先搜索算法嗎?

在遞歸深度優先搜索算法中,每個像元具有三個狀態中的一個(未訪問,正在訪問和已訪問)。 想法是遍歷圖並訪問每個節點。 如果節點處於“未訪問”狀態,它將變為“正在訪問”,並且將訪問每個鄰居。 在訪問了每個鄰居之后,該節點變為“已訪問”。 為此,您必須記住一次訪問過的迷宮中的每個單元,而永遠不會再遍歷它。 history完全填充條件“正在訪問”的每個成員,以及map完全填充條件“已訪問”中設置的每個單元格。 我的回答是:

評論您的第二個問題:

我將如何將其繪制到圖像文件?

要繪制圖像,我建議您使用CImg庫。 查看更多問題繪制圖像的最簡單方法?

如果您想繪制遍歷的路徑,則需要第二個堆棧或類似的容器,在其中記錄已完成的所有步驟。 也許您可以為每個步驟從一個柵格繪制箭頭和柵格到另一個柵格。 如果您從北向南畫右箭頭,從南向北畫箭頭,從東向西向下的箭從西向東畫箭頭,您將不會有任何重疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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