走迷宮2(bfs)
阿新 • • 發佈:2022-03-25
有一個二維迷宮,n行m列,‘s’表示迷宮的起點,‘T’表示迷宮的終點,
‘#’表示圍牆,‘.’表示通路。現在從S出發,你不能穿牆,問到達終點T最
少需要多少步?
輸入格式:第一行輸入n,m(1<=n,m<=50)表示迷宮的行列大小。
接下來輸入n行字串表示迷宮。
輸出格式:一個整數,表示走出迷宮所需的最小步數,若走不出迷宮則輸出 -1。
樣例輸入1
2 3
S.#
..T
樣例輸出1
3
樣例輸入2
3 3
S.#
.#.
.#T
樣例輸出2
-1
‘#’表示圍牆,‘.’表示通路。現在從S出發,你不能穿牆,問到達終點T最
少需要多少步?
輸入格式:第一行輸入n,m(1<=n,m<=50)表示迷宮的行列大小。
接下來輸入n行字串表示迷宮。
輸出格式:一個整數,表示走出迷宮所需的最小步數,若走不出迷宮則輸出 -1。
樣例輸入1
2 3
S.#
..T
樣例輸出1
3
樣例輸入2
3 3
S.#
.#.
.#T
樣例輸出2
-1
#include <iostream> #include <queue> using namespacestd; int vis[101][101] = {0}; char map[101][101]; int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; int n, m, flag, val; struct point { int x, y, num; //存點和當前深度 point(int xx, int yy, int dd) { x = xx; y = yy; num = dd; } //解構函式便於初始化賦值,和class類相似的處理 }; queue<point> q;void bfs(int sx, int sy) { q.push(point(sx, sy, 0)); //放入起始位置點,從此開始 vis[sx][sy] = 1; while (!q.empty()) { point p = q.front(); q.pop(); //把裡元素依次取出,再將先放入點彈出(避免重複) if (map[p.x][p.y] == 'T') //找到終點記錄(bfs第一次找到的就是最短步) { val = p.num;//裝步數flag = 1; break; } for (int i = 0; i < 4; i++) { int a = p.x + dir[i][0]; int b = p.y + dir[i][1]; //典中點之四向判斷 if (map[a][b] != '#' && vis[a][b] == 0 && a >= 0 && a < n && b >= 0 && b < m) { q.push(point(a, b, p.num + 1)); //將四周可行的點放入佇列後(加的這幾個點深度相同) vis[a][b] = 1; //來過了 } } } } int main() { int s1, s2; flag = 0;//標記找到與否 cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> map[i][j]; if (map[i][j] == 'S') //找到了入口 { s1 = i; s2 = j; } } } bfs(s1, s2); if (flag == 0) cout << "-1"; else cout << val << endl; return 0; }