左邊是原始迷宮圖,右邊將其所有路徑進行了標記,發現有3個出口,並且中間帶環。
這就是乙個多條出路且帶環的迷宮圖。如何找到它的最短路徑呢?
首先對這個迷宮初始化
void mazeinitshortpathwithcycle(maze* maze)
, ,,,
,};size_t i = 0;
for(; i < max_row; ++i)
return;
}
輔助函式的構造:
1.標記規則的改變
void markwithcycle(maze* maze, point cur, point pre)
else
return;
}
如果錢乙個點是入口點的前乙個點,直接將入口標記為2;不然就直接將當前點標記為上乙個點+1;
2.是否能落腳判斷
int canstaywithcycle(maze* maze, point cur, point pre)
int cur_value = maze->map[cur.row][cur.col];
if (cur_value == 0)
if (cur_value == 1)
int pre_value = maze->map[pre.row][pre.col];
if (cur_value > pre_value + 1)
return 0;
}
能落腳返回0,不能返回1。
1.在邊界外,不能落腳
2.如果是牆(牆為0)也不能落腳,是1(1為沒走過的路)則直接落腳
3.如果當前落腳值》前乙個路徑點的值+1,則不能落腳。(假設前乙個點為3,這乙個落腳點本應該標記為4,如果發現它已經是9則說明曾經有一條路徑經過9-1=8步(因為走的第一步就將1標記為2)走到這裡,所以可以落腳,因為此次只需要通過4步走到這裡;如果發現它是2,則說明至之前有條路徑2-1=1步就走到這裡,說明此次的路不是最短的路,就可以回溯了。
可以開始找最短路徑了
void _getshortpathwithcycle(maze* maze, point cur, point pre, point entry, seqstack* cur_path, seqstack* short_path)
seqstackpopback(cur_path);
return;
}point up = cur;
up.row -= 1;
_getshortpathwithcycle(maze, up, cur, entry, cur_path, short_path);//update pre.so is cur not pre.
point right = cur;
right.col += 1;
_getshortpathwithcycle(maze, right, cur, entry, cur_path, short_path);
point down = cur;
down.row += 1;
_getshortpathwithcycle(maze, down, cur, entry, cur_path, short_path);
point left = cur;
left.col -= 1;
_getshortpathwithcycle(maze, left, cur, entry, cur_path, short_path);
seqstackpopback(cur_path);
}void getshortpathwithcycle(maze* maze, point entry)
; _getshortpathwithcycle(maze, entry, pre, entry, &cur_path, &short_path);
seqstackdebugprint(&short_path, "the shortest road");
}
1.定義兩個棧存當前路徑的點和最短路徑的點
2.初始化兩個棧
3.定義乙個入口點的前乙個點(在標記函式中使用)
4.通過乙個輔助函式來幫我們遞迴尋找最短路徑。
4.1指標合法性判斷
4.2 判斷這個點是否能走,能走則標記
4.3 將這個點入當前棧
4.4 判斷這個點是不是出口點
4.4(a)是出口點,則判斷是否為最短路徑(是最短路徑,則將其賦值到最短路徑棧中;不是最短路徑,則出棧返回本次遞迴,返回到它的上乙個點繼續進行四個方向的判斷)
注意:只要是出口了,
都要將cur_path出棧,並且回溯,繼續找。
4.4(b)不是出口點,則進行四個方向的判斷。
4.5 四個方向都判斷完了之後,則出棧,回溯到上乙個點。
測試**如下:
void testmaze4()
; getshortpathwithcycle(&maze,entry);
mazeprint(&maze);
}
測試結果如下:
Linux資料結構 迷宮(多條出口且不帶環)
之前有說過一條簡單的迷宮之路求解 只有一條出路且不帶環 這一篇講的是如何處理多條出路的情況。主要思路 借用兩個棧,乙個儲存當前出路的路徑點,乙個儲存最短的出路的路徑點。每找到一條出路則對比最短出路,哪一條路短,則存到最短路徑棧中。首先我們先初始化乙個棧 void mazeinitshortpath ...
資料結構 迷宮
迷宮問題.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 ...
資料結構之迷宮
這個主要是練習棧的使用,當時編了好長時間呢。以乙個mxn的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的額迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。如下 include iostream using namespace std int east 1 int...