挑戰程式設計 迷宮的最短路徑(BFS)

2021-09-25 05:16:27 字數 1822 閱讀 3081

目錄題解

寬度優先搜尋

題目詳情

description

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

限制條件:

n,m <= 100

input

輸入兩個數字 n 和 m,分別表示迷宮的長和寬,用空格隔開

輸入代表迷宮的字串,n 行 m 列,由'#','~','s','g'組成,分別表示牆壁,通道,起點,終點

output

從起點到終點所需的最小步數

sample input

10 10

#s######.#

......#..#

.#.##.##.#

.#........

##.##.####

....#....#

.#######.#

....#.....

.####.###.

....#...g#

sample output

22
#include#include#includeusing namespace std;

const int inf=100000000;

const int max_n=100+5,max_m=100+5;

typedef pairp; //把 pair看作結構體,typedef的用法,p就是該結構體的乙個例項。該"結構體"內只有兩個元素

//輸入

char a[max_n][max_m]; //表示迷宮的字串陣列

int n,m; //迷宮的長寬

int sx,sy; //起點座標

int gx,gy; //終點座標

int d[max_n][max_m]; //存放到各個位置的最短距離的陣列

//向四個方向移動的向量:右、上、左、下

int dx[4]=; //dx[i]是向量的橫座標

int dy[4]=; //dy[i]是向量的縱座標

//從(sx,sy)到(gx,gy)的最短距離。如果無法到達,則是inf

int bfs(){

queueque;

for(int i=0;i本題中,狀態是目前所在位置的座標,可以構造成 pair 或者編碼成 int 來表達狀態。當狀態更加複雜時,需要封裝成乙個類來表示

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

寬度優先搜尋可以用來求最短路徑,最少操作之類的問題

對於同乙個狀態,寬度優先搜尋只經過一次,因此時間複雜度:o(狀態數 * 轉移的方式)

寬度優先搜尋與深度優先搜尋類似,從某個狀態出發,探索所有可以到達的狀態。不同之處在於,寬度優先搜尋總是先搜尋距離初始狀態近的狀態

深度優先搜尋利用棧進行計算,寬度優先搜尋則利用了佇列。搜尋時首先將初始狀態加到佇列裡,此後從佇列的最前端不斷取出狀態,把從該狀態可以轉移到的狀態中尚未訪問過的部分加入佇列,如此往復,直至隊列為空或找到了問題的解

寬度優先搜尋會把狀態逐個加入佇列,通常需要與狀態數成正比的記憶體空間。反之,深度優先搜尋與最大的遞迴深度成正比。一般與狀態數相比,遞迴的深度不會太大,所以可以認為深度優先搜尋更加節省記憶體

BFS 迷宮的最短路徑

迷宮的最短路徑 給定乙個大小為n m的迷宮。迷宮由通道和牆壁組成,每一步可以 向鄰接的上下左右四個方位的通道移動,請求出從起點到終點所需的最小不熟。此題假設一定能從起點到終點 限制條件 n,m 100 樣例 輸入 10 10 s g 輸出 22 include include includeusin...

迷宮的最短路徑 bfs

給定乙個大小為n m的迷宮,由通道 和牆壁 組成,其中通道s表示起點,通道g表示終點,每一步移動可以達到上下左右中不是牆壁的位置。試求出起點到終點的最小步數。本題假定迷宮是有解的 n,m 100 樣例輸入 樣例輸出 include include include using namespace st...

BFS 迷宮的最短路徑

迷宮的最短路徑 給定乙個大小為n m 的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點 限制條件 n m 100 s g 分別代表 牆壁 通道 起點和終點。sample input 10 10 s g ...