输入输出:
input:
5 5
. . . . .
. * . * .
. * . * .
. * * * .
. . . . *
2 2 4 3
output:
11
input:
5 5
. . . * .
. * . * .
. * . * .
. * * * .
. * . . *
2 2 4 3
output:
-1
注意事项:
1.千万不要把"==" 写成了"=";
2.注意输入时的控制,要过滤掉空格和换行符号:
代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=101;
struct node{
int x,y; //location(x,y)
int step; //从起点到该点的最小步数
}S,T,Node; //S-起点 T-终点 Node-临时结点
int n,m;
char mat[maxn][maxn];
bool inq[maxn][maxn]={false};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool check(int x,int y){
if(x>=n||x<0||y>=m||y<0) return false;
if(mat[x][y]=='*'||inq[x][y]==true) return false;
return true;
}
int BFS(){
//1.起点入栈
queue<node> Q;
Q.push(S);
inq[S.x][S.y]=true;
while(!Q.empty()){
//2.弹出栈首
node top = Q.front();
Q.pop();
//3.判断 若点x,y为终点,返回步数
if(top.x == T.x&&top.y == T.y) return top.step;
//4.遍历四周的点
for(int i = 0;i<4;i++){
int newx = top.x + dx[i];
int newy = top.y + dy[i];
//5.合法点记录步数并入队,flag标记
if(check(newx,newy)){
node mnode;
mnode.x = newx,mnode.y = newy;
mnode.step = top.step + 1;
Q.push(mnode);
inq[newx][newy] = true;
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
//过滤掉每行的换行符号
for(int j=0;j<m;j++){
scanf("\n%c",&mat[i][j]);
}
}
scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
S.step=0;
printf("%d\n",BFS());
return 0;
}