迷宫的最短路径
给定一个大小为 NxM的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格
的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动
到终点。
是道BFS的题目。
输入:
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出:
22
#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;
char w[110][110];
int N=0;
int M=0;
int ans=0;
int s_x,s_y;
int d_x,d_y;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int mark[110][110];
typedef pair<int,int> PA;
void bfs(){
queue<PA> q;
q.push(PA(s_x,s_y));
memset(mark, -1, sizeof(mark));
mark[s_x][s_y]=0;
while(q.size()){
PA p=q.front();
q.pop();
if(p.first==d_x&&p.second==d_y){
return;
}
for(int i=0;i<4;i++){
int x_n=p.first+dx[i];
int y_n=p.second+dy[i];
if(w[x_n][y_n]!='#'&&x_n>=0&&x_n<N&&y_n>=0&&y_n<M&&mark[x_n][y_n]==-1){
q.push(PA(x_n,y_n));
mark[x_n][y_n]=mark[p.first][p.second]+1;
}
}
}
}
int main()
{
scanf("%d %d",&N,&M);
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>w[i][j];
if(w[i][j]=='S'){
s_x=i;
s_y=j;
}
if(w[i][j]=='G'){
d_x=i;
d_y=j;
}
}
}
bfs();
printf("%d\n",mark[d_x][d_y]);
return 0;
}