- description:
给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。 - 样例输入输出:
输入:
输出:
22 - AC code:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1e8+6;
typedef pair<int,int>P;
const int MAX_N=1e2+6;
char maze[MAX_N][MAX_N+1];
int N,M,sx,sy,gx,gy;
int d[MAX_N][MAX_N];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs(){
queue<P>que;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)d[i][j]=INF;
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size()){
P p=que.front();que.pop();
if(p.first==gx&&p.second==gy)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&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}
void solve(){
int res=bfs();
printf("%d\n",res);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>N>>M;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)cin>>maze[i][j];
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
if(maze[i][j]=='S')sx=i,sy=j;
else if(maze[i][j]=='G')gx=i,gy=j;
solve();
}