题目描述
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个 n × m 的迷宫的图纸,请你找出从起点到出口的最短路。
输入格式
第一行是两个整数 n 和 m (1 ≤ n, m ≤ 100),表示迷宫的行数和列数。
接下来 n 行,每行一个长为 m 的字符串,表示整个迷宫的布局,字符 .
表示空地,#
表示墙,S
表示起点,T
表示出口。
输出格式
输出从起点到出口最少需要走的步数。
输入样例
3 3
S#T
.#.
...
输出样例
6
题解
BFS:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node{
int x, y;
}S;
const int N = 110;
int n, m;
char g[N][N];
int dist[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
queue<node> q;
int bfs()
{
while(q.size())
{
node t = q.front();
q.pop();
if(g[t.x][t.y] == 'T') return dist[t.x][t.y];
for (int i = 0; i < 4; i ++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if(a < 1 || a > n || b < 1 || b > m) continue;
if(dist[a][b] != -1 || g[a][b] == '#') continue;
q.push({a, b});
dist[a][b] = dist[t.x][t.y] + 1;
}
}
return -1;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> g[i] + 1;
memset(dist, -1, sizeof dist);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if(g[i][j] == 'S')
{
q.push({i, j});
dist[i][j] = 0;
}
cout << bfs() << endl;
return 0;
}