回溯法找迷宮最短路徑

2021-06-25 20:43:35 字數 1257 閱讀 9767

有乙個二維陣列,0表示路,-1表示牆,求其中任意兩點的最短路徑

我們先看,怎麼求一條路徑:求兩點路徑是乙個資料結構上的典型的迷宮問題,解決辦法如下:

從一點開始出發,向四個方向查詢(上,右,下,左),每走一步,把走過的點的值+1,防止重複行走,並把走過的點壓入堆疊(表示路徑),如果遇到牆、或者已走過的點則不能前進,如果前方已經無路可走,則返回,路徑退棧,這樣遞迴呼叫,直到找到終點為止。

如果我們調整查詢的順序,改為左、右、上、下,可能會得到更短的路徑,但這種方法不能保證一定是最短路徑。

經過網上查詢、看書,以下方法可以得到最短路徑:

按照左、右、上、下方向,每走一步,就把將要走的節點賦值為此節點值+1,走過的路徑也可以重複行走。條件是本節點值+1必須小於已走過的節點的值(牆不能走),這樣遍歷所有的節點,便可以記錄最短的路徑。

c++**實現如下:

#include #include #include using namespace std;

class maze

//查詢最短路徑

void searchpath()

//列印最短路徑走過的點

void printpath()

for( size_t i = 0; i < 4; ++i) //遍歷四個方向

}} //判斷start到next能否走通

bool iscango(const node& start, const node& next)const

stackm_path; //儲存最短路徑

stackm_temppath; //儲存臨時路徑

node m_start; //迷宮入口

node m_end; //迷宮出口

static int m_maze[10][10]; //迷宮

static node offset[4]; //四個方向偏移量

};int maze::m_maze[10] = ,,,

,,,,

,,};maze::node maze::offset = ;

int main(void)

結果如下:(座標後數字為當前走過節點數)

迷宮最短路徑

include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...

迷宮最短路徑

問題描述 小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上 向下 向左 向右移動 每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。任務要求 1 迷...

迷宮問題 壓棧 回溯 全部路徑 最短路徑

用迴圈模擬壓棧來實現迷宮問題 arg.att 這個狀態用來標記我們是否試走過 此處 的四個方位,因為0是牆,1是路,所以我們用2來表示我們試過此處的左邊能不能通行,3用來表示此處的上方是否通行,4表示右邊,5表示下邊。用6來表示出口。假如說試過左邊不能走,我們就將標記改為3,讓他繼續試上邊能不能走。...