1. 程式人生 > 其它 >走迷宮2(bfs)

走迷宮2(bfs)

有一個二維迷宮nms’表示迷宮的起點T’表示迷宮的終點
#’表示圍牆.表示通路現在從S出發你不能穿牆問到達終點T
少需要多少步
輸入格式:第一行輸入n,m1<=n,m<=50表示迷宮的行列大小
接下來輸入n行字串表示迷宮
輸出格式:一個整數表示走出迷宮所需的最小步數若走不出迷宮則輸出 -1
樣例輸入1
 2 3
 S.#
..T
 樣例輸出1
 3
 樣例輸入2
 3 3
 S.#
 .#.
 .#T
樣例輸出2
 -1
 
#include <iostream>
#include <queue>
using namespace
std; 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; }