Linux資料結構 迷宮(多條出路且帶環)

2021-08-19 14:11:28 字數 2790 閱讀 8778

左邊是原始迷宮圖,右邊將其所有路徑進行了標記,發現有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...