迷宮的最短路徑

2021-10-13 05:36:22 字數 1133 閱讀 7188

題目:

n=10, m=10 (迷宮如下圖所示。, 』 . 』 , -s』 ,分別表示牆壁、通道、起點和終點)

#s######.#

#. .#

.# ##.##.####

.#######.#

…# .####.###.

g#給定乙個大小為nxm的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格 的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動 到終點。

寬度優先搜尋按照距開始狀態由近及遠的順序進行搜尋,因此可以很容易地用來求最短路徑、最 少操作之類問題的答案。這個問題中,狀態僅僅是目前所在位置的座標,因此可以構造成pair 或者編碼成int來表達狀態。當狀態更加複雜時,就需要封裝成乙個類來表示狀態了。轉移的方 式為四方向移動,狀態數與迷宮的大小是相等的,所以複雜度是o(4xnxm)=o(n*m)。

寬度優先搜尋中,只要將已經訪問過的狀態用標記管理起來,就可以很好地做到由近及遠的搜尋。 這個問題中由於要求最短距離,不妨用d[n] [m]陣列把最短距離儲存起來。初始時用充分大的常 數inf來初始化它,這樣尚未到達的位置就是inf,也就同時起到了標記的作用。

因為要向4個不同方向移動,用dx[4]和dy[4]兩個陣列來表示四個方向向量。這樣通過乙個循 環就可以實現四方向移動的遍歷。

const

int inf =

100000000

;//使用pair表示狀態時,使用typedef會更加方便一些

typedef pair<

int,

int> p;

//輸入

char maze[max_n]

[max_m]

;int n, m;

int sx, sy;

//起點

int gx, gy;

//終點

int d[max_n]

[max_m]

;// 到各個位置的最短距離的陣列

// 4個方向移動的向量

int dx[4]

=, dy [4]

=//該點加入佇列 距離增加一}}

}return d[gx]

[gy]

;//返回總步數

}

迷宮最短路徑

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

迷宮的最短路徑

雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...