之前有說過一條簡單的迷宮之路求解(只有一條出路且不帶環)
這一篇講的是如何處理多條出路的情況。
主要思路:借用兩個棧,乙個儲存當前出路的路徑點,乙個儲存最短的出路的路徑點。每找到一條出路則對比最短出路,哪一條路短,則存到最短路徑棧中。
首先我們先初始化乙個棧:
void mazeinitshortpath(maze* maze)
, ,,,
,};size_t i = 0;
for(; i < max_row; ++i)
return;
}
輔助函式:將當前路徑賦值到最短路徑棧中
void seqstackassgin(seqstack* from, seqstack* to)
}
1.定義兩個棧,cur_path,short_path分別儲存當前路徑點和最短路徑點。
2.初始化兩個棧。
3.通過輔助函式_getshortpath(maze, entry, entry, &cur_path, &short_path);遞迴來找出路。
3.1 指標合法性判斷
3.2 判斷這個點是否能走,能走則標記為2
3.3 將這個點入當前棧
3.4 判斷這個點是不是出口點
3.4(a)是出口點,則判斷是否為最短路徑(是最短路徑,則將其賦值到最短路徑棧中;不是最短路徑,則出棧返回本次遞迴,返回到它的上乙個點繼續進行四個方向的判斷)
3.4(b)不是出口點,則進行四個方向的判斷。
3.5 四個方向都判斷完了之後,則出棧,回溯到上乙個點。
void _getshortpath(maze* maze,point cur,point entry, seqstack* cur_path, seqstack* short_path)
seqstackpopback(cur_path);
return;
}else
seqstackpopback(cur_path);
}#ifdef for_maze
#includevoid seqstackdebugprint(seqstack* stack, const char* msg)
#endif
void getshortpath(maze* maze ,point entry)
測試**如下:
void testmaze3()
; getshortpath(&maze,entry);
mazeprint(&maze);
}
測試結果如下:
Linux資料結構 迷宮(多條出路且帶環)
左邊是原始迷宮圖,右邊將其所有路徑進行了標記,發現有3個出口,並且中間帶環。這就是乙個多條出路且帶環的迷宮圖。如何找到它的最短路徑呢?首先對這個迷宮初始化 void mazeinitshortpathwithcycle maze maze size t i 0 for i max row i ret...
資料結構 求多出口迷宮的最短路徑
上面我們已經寫過遞迴和非遞迴來實現求解迷宮的問題,今天我們就在遞迴的基礎上實現多條通路,最短問題。初始化最短路徑地圖 多通路最短路徑 void mazeinitshortpath maze maze int i 0 for iint j 0 for jmap i j map i j 用這個特殊的函式...
資料結構 迷宮
迷宮問題.cpp 定義控制台應用程式的入口點。include stdafx.h define m 4 define n 4 define maxsize 100 int mg m 2 n 2 struct stack maxsize path maxsize 定義棧和最短路徑的陣列 初始化 int ...