目錄題解
寬度優先搜尋
題目詳情
description
給定乙個大小為 n * m 的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數
限制條件:
n,m <= 100
input
輸入兩個數字 n 和 m,分別表示迷宮的長和寬,用空格隔開
輸入代表迷宮的字串,n 行 m 列,由'#','~','s','g'組成,分別表示牆壁,通道,起點,終點
output
從起點到終點所需的最小步數
sample input
10 10sample output#s######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...g#
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 ...