資料結構 多出口迷宮找出一條最短路徑

2021-08-19 10:05:59 字數 2149 閱讀 4597

前面我們實現了基礎版本的迷宮求解,只有一條路徑。現在如果有多個出口,我們該如何去找到一條最短的路徑。

我們先來思考一下我們是如何在乙個陣列裡找最小值的?

有下面乙個陣列:

我們可以先把第乙個數設為最小值,然後遍歷陣列,拿它和後面的元素進行比較,把兩個數中較小的賦給min,直到遍歷完整個陣列,min中就是陣列中的最小值。

同樣的,找最短路徑也是一樣的思路。我們可以定義兩個棧,乙個cur_path儲存當前路徑,乙個short_path儲存最短路徑,每次找到一條路徑,將它儲存在cur_path裡,並和short_path進行比較,將兩條路徑中較短的路徑儲存在short_path中,最後列印short_path的內容。

可以看出,黃色圈出來的就是最短路徑。

步驟也是和前面大體一致,只是加了乙個當前路徑cur_path和最短路徑short_path的比較,**中有詳解,大家可以參考一下.

話不多說,直接上**:

//先對迷宮初始化

void mazeshortpathinit(maze* maze)

, ,

,, ,,

};size_t i = 0;

for( ;i < max_row;i++)

}return;

}//遍歷所有的路徑,然後從其中找出一條最短路徑

//實現遞迴版本

void getshortpath(maze* maze,point entry)

void _getshortpath(maze* maze,point cur,point entry,seqstack* cur_path,seqstack* short_path)

//2.如果能落腳,標記當前點並且入棧到cur_path

mark(maze,cur);

seqstackpush(cur_path,cur);

//3.判斷當前點是否為出口

if(i***it(maze,cur,entry))

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);

}

這裡用到的輔助函式列印棧資訊seqstackprintdebug()和棧替換seqstackassgin()如下,而判斷當前點能不能落腳canstay()函式,判斷是否是出口i***it()函式和標記mark()函式在之前部落格中(基礎版迷宮求解)寫過,這裡就不做具體介紹。

void

seqstackassgin(seqstack* from,seqstack* to)

return;

}void

seqstackprintdebug(seqstack* stack,char* msg)

printf("\n");

}

結果如下圖:

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

上面我們已經寫過遞迴和非遞迴來實現求解迷宮的問題,今天我們就在遞迴的基礎上實現多條通路,最短問題。初始化最短路徑地圖 多通路最短路徑 void mazeinitshortpath maze maze int i 0 for iint j 0 for jmap i j map i j 用這個特殊的函式...

資料結構 求多出口帶環迷宮的最短路徑(遞迴版本)

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

迷宮深度優先搜尋 找出一條可行路徑

請寫乙個程式,先輸入迷宮的維度m和n,然後輸入這個m n的迷宮,迷宮位置上的數值為0代表該位置可以通過,為1代表該位置有障礙不能通過,用深度優先搜尋演算法搜出一條從迷宮左上角到右下角的路徑。規定搜尋順序為上 下 左 右。如 迷宮為2 2的 搜尋從左上角開始,到達右下角的路徑應該是 0,0 1,0 1...