T1. 走出迷宫
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个 n × m n\times m n×m 的迷宫的图纸,请你找到从起点到出口的最短路。
时间限制:1 s
内存限制:64 MB
- 输入
第一行是两个整数 n n n 和 m m m( 1 ≤ n , m ≤ 100 1 \le n, m \le 100 1≤n,m≤100),表示迷宫的行数和列数。
接下来 n n n 行,每行一个长为 m m m 的字符串,表示整个迷宫的布局。字符.
表示空地,#
表示墙,S
表示起点,T
表示出口。 - 输出
输出从起点到出口最少需要走的步数。 - 样例输入
3 3 S#T .#. ...
- 样例输出
6
思路分析
此题考查洪水填充算法中的 B F S \tt BFS BFS,属于模板题,此处不再赘述。
/*
* Name: T1.cpp
* Problem: 走出迷宫
* Author: Teacher Gao.
* Date&Time: 2025/07/18 14:42
*/
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int dx[] = {
1, 0, -1, 0};
const int dy[] = {
0, 1, 0, -1};
int n, m;
char g[105][105];
int dis[105][105];
void BFS(int sx, int sy) {
queue<int> Q;
Q.push(sx); Q.push(sy);
memset(dis, 0, sizeof(dis));
while (!Q.empty()) {
int x = Q.front(); Q.pop();
int y = Q.front(); Q.pop();
if (g[x][y] == 'T') {
cout << dis[x][y] << "\n";
return ;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
if (g[nx][ny] == '#' || dis[nx][ny]) continue;
dis[nx][ny] = dis[x][y] + 1;
Q.push(nx