一本通-1254:走出迷宫(二维迷宫型BFS)¶
【题目描述】 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】 第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】 输出从起点到出口最少需要走的步数。
【输入样例】 3 3 S#T .#. ...
【输出样例】 6
这道题其实存在一点疑问,是否一定可以到达终点,题目并未说清,那就默认可以到达吧,然后就是一个简单的二维BFS。
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int x, y;
Node(int a, int b): x(a), y(b) {}
};
int m, n;
vector<vector<char> > grid(105, vector<char>(105));
vector<vector<int> > path(105, vector<int>(105, INT_MAX));
int startX, startY, endX, endY;
int direction[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void BFS()
{
path[startX][startY] = 0;
grid[startX][startY] = '#';
queue<Node> q;
q.push(Node(startX, startY));
while (!q.empty()) {
Node tmp = q.front(); q.pop();
if (tmp.x == endX && tmp.y == endY) break;
for (int i = 0; i < 4; ++i) {
int nextRow = tmp.x + direction[i][0];
int nextCol = tmp.y + direction[i][1];
if (0 <= nextRow && nextRow < m && 0 <= nextCol && nextCol < n && grid[nextRow][nextCol] == '.') {
path[nextRow][nextCol] = path[tmp.x][tmp.y] + 1;
grid[nextRow][nextCol] = '#';
q.push(Node(nextRow, nextCol));
}
}
}
cout << path[endX][endY] << endl;
}
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> m >> n;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> grid[i][j];
if (grid[i][j] == 'S') {
startX = i; startY = j;
}
else if (grid[i][j] == 'T') {
endX = i; endY = j;
grid[i][j] = '.';
}
}
}
BFS();
return 0;
}