[英]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.