上面我們已經寫過遞迴和非遞迴來實現求解迷宮的問題,今天我們就在遞迴的基礎上實現多條通路,最短問題。
初始化最短路徑地圖
///
//////
//////
//////
//////
//////
//////
//////
////
//////
////////多通路最短路徑///
//////
//////
//////
//////
//////
//////
//////
//////
//////
//////
//////
void mazeinitshortpath(maze* maze),,,
,,,};
int i = 0;
for (; iint j = 0;
for (; jmap[i][j] = map[i][j];}}
}
用這個特殊的函式來列印棧
//這個函式只用於迷宮問題,用來除錯,通常意義下,我們棧不允許
//遍歷的,但是如果進行測試或除錯,這是個例外
//因此在這裡函式雖然進行了遍歷,但是僅用於除錯
//之所以寫這樣乙個函式遍歷棧,為了能夠從入口的順序來列印棧中的內容
void seqstackdebugprint(seqstack* stack, const
char* msg)
size_t i=0;
for(;isize;i++)
printf("\n");
}void seqstackdestroy(seqstack* stack)
void _getshortpath(maze* maze,point cur,point entry,seqstack* cur_path,seqstack* short_path)
//2、如果能落腳,就對當前點進行標記,同時把當前點插入到當前cur_path
else
//3、判斷當前點是否出口
if(i***it(maze,cur,entry))
seqstackassgin(cur_path,short_path);//棧物件賦值
// b、如果當前路徑沒有比short_path短,就要嘗試著去找其他路徑(進行回溯)
//在回溯之前也要把cur_path棧頂元素也進行出棧
seqstackpop(cur_path);
return;
}//4、如果當前點不是出口,嘗試探測四個方向(按照順時針來探測)
point up=cur;
up.row-=1;
_getshortpath(maze,up,entry,cur_path,short_path);
point right=cur;
right.col+=1;
_getshortpath(maze,right,entry,cur_path,short_path);
point down=cur;
down.row+=1;
_getshortpath(maze,down,entry,cur_path,short_path);
point left=cur;
left.col-=1;
_getshortpath(maze,left,entry,cur_path,short_path);
// 5、如果四個方向都遞迴探測過了,就可以進行
// 出棧(指當前函式棧幀結束,同時cur_path,也要進行出棧)回溯到
//上乙個點
seqstackpop(cur_path);
return;
}
我們的思路就是嘗試找到所有的路徑,然後從所有的路徑中找到最短的路徑
void getshortpath(maze* maze,point entry)
測試函式如下:
void test3();
getshortpath(&maze,entry);
mazeprint(&maze);
}
我們的主要思路就是定義出兩個棧,然後讓乙個存放當前的路徑,乙個存放的是最小的路徑,我們每次用當前的路徑和最小的路徑進行比較,小的存放在存放最小路徑的棧中。 資料結構 求多出口帶環迷宮的最短路徑(遞迴版本)
maze.h pragma once includetypedef struct pospos typedef struct mazemaze maze.c define crt secure no warnings 1 include include maze.h include stack.h ...
資料結構 多出口迷宮找出一條最短路徑
前面我們實現了基礎版本的迷宮求解,只有一條路徑。現在如果有多個出口,我們該如何去找到一條最短的路徑。我們先來思考一下我們是如何在乙個陣列裡找最小值的?有下面乙個陣列 我們可以先把第乙個數設為最小值,然後遍歷陣列,拿它和後面的元素進行比較,把兩個數中較小的賦給min,直到遍歷完整個陣列,min中就是陣...
資料結構 佇列 迷宮的最短路徑
問題 資料結構 c語言版 主編 秦鋒 p86 求迷宮的最短路徑 現在設計乙個演算法找一條從迷宮入口到出口的最短路徑。此程式和書上的思路不一樣。這個演算法是佇列,遞迴綜合考察 include include define maxsize 100 using namespace std int maze...