資料結構 求多出口迷宮的最短路徑

2021-08-19 03:02:26 字數 2268 閱讀 2951

上面我們已經寫過遞迴和非遞迴來實現求解迷宮的問題,今天我們就在遞迴的基礎上實現多條通路,最短問題。

初始化最短路徑地圖

///

//////

//////

//////

//////

//////

//////

//////

////

//////

////////多通路最短路徑///

//////

//////

//////

//////

//////

//////

//////

//////

//////

//////

//////

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...