给定一个大小为 N \times MN×M 的迷宫,由通道和墙壁组成。
每一步可以向相邻的上下左右四个方向移动。
请求出起点到终点的最小步数。本题保证从起点一定能走到终点。
#
表示墙壁,不可走。 .
表示通道,可走。S
表示起点。G
表示终点。
输入
- 第一行两个整数 N, M(1 \leq N,M \leq 100)N,M(1≤N,M≤100)
- 接下来 NN 行,每行 MM 个字符,表示迷宫
输出
- 输出一行,表示从起点到终点的最少步数
样例 1
输入
10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G#
输出
#include<bits/stdc++.h>
using namespace std;
int N, M;
char ch[105][105];
int arr[105][105];
typedef pair<int,int> P;
int qx, qy, zx, zy;
int dx[4] = {0,0,-1,1};
int dy[4] = {-1, 1, 0, 0};
int bfs(){
queue<P> que;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
arr[i][j] = 0x3f3f3f3f;
}
}
que.push(P(qx, qy));
arr[qx][qy] = 0;
while(!que.empty()){
P p = que.front();
que.pop();
if(p.first == zx && p.second == zy) break;
for(int i = 0; i < 4; i++){
int nx = p.first + dx[i], ny = p.second + dy[i];
if(nx >= 0 && nx < N && ny >= 0 && ny < M && ch[nx][ny] != '#' && arr[nx][ny] == 0x3f3f3f3f){
que.push(P(nx, ny));
arr[nx][ny] = arr[p.first][p.second] + 1;
}
}
}
return arr[zx][zy];
}
int main(void){
cin >> N >> M;
for(int i = 0; i < N; i++) cin >> ch[i];
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(ch[i][j] == 'S'){
qx = i;
qy = j;
}
if(ch[i][j] == 'G'){
zx = i;
zy = j;
}
}
}
cout << bfs() << endl;
return 0;
}
22