给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而‘.代表平地,S表示起点,T表示终点。移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右四个位置的平地,求从起点S到达终点T的最少步数。
样例:
.....
.*.*.
.*S*.
.***.
...T*
在上面样例中,S的坐标为(2,2),T的坐标为(4,3)。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 100;
struct node{
int x,y;
int step;
}S,T,Node;
int n,m;
char maze[maxn][maxn];
bool flag[maxn][maxn] = {false};
int X[4] = {0,0,1,-1};
int Y[4] = {1,-1,0,0};
bool judge(int x,int y){
if(x>=n || x<0 || y>=m || y<0){
return false;
}
if((flag[x][y]==true)){
return false;
}
if(maze[x][y]=='*')
return false;
return true;
}
int BFS(){
queue<node> q;
q.push(S);
flag[S.x][S.y] = true;
while(!q.empty()){
node top = q.front();
q.pop();
if(top.x==T.x && top.y==T.y){
return top.step;
}
for(int i=0;i<4;i++){
int newX = top.x+X[i];
int newY = top.y+Y[i];
if(judge(newX,newY)){
Node.x = newX;
Node.y = newY;
Node.step = top.step+1;
q.push(Node);
flag[newX][newY] = true;
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
getchar();
for(int j=0;j<m;j++){
maze[i][j] = getchar();
}
maze[i][m+1] = '\0';
}
scanf("%d %d %d %d",&S.x,&S.y,&T.x,&T.y);
S.step=0;
printf("%d\n",BFS());
return 0;
}