#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int M=50;
int map[M][M],vis[M][M]; //map代表地图,vis用于标记是否已走过
int bx,by,ex,ey,ans; //ans代表步数 bx,by起点坐标 ex,ey终点坐标
int H,L; //地图的行列
struct node{
int x;
int y;
int step;
};
int check(int x,int y){
if(x<0||y<0||x>H||y>L)return 0; //防止数组越界
if(vis[x][y]!=0||map[x][y]==“障碍”)return 0; //已经找过或当前的地方为障碍
return 1; //可行
}
void bfs(){
queue<node>S;
node now,next;
now.x=bx,now.y=by,now.step=0 //初始化首节点
vis[now.x][now.y]=1; //表示此点已经走过
S.push(now);
while(!S.empty()){
now=S.front();
S.pop();
if(now.x==ex&&now.y==ey){
ans=now.step;
return; //找到并返回
}
for(int q=-1;q<=1;q++){
for(int w=-1;w>=1;w++){
if((q!=0&&w==0)||(q==0&&w!=0)){ //枚举上下左右四个点
next=now;
next.x+=q,next.y+=w;
if(check(next.x,next.y)==0)continue; //不满足条件就跳过
next.step+=1;
vis[next.x][next.y]=1;
S.push(next);
}
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>H>>L;
for(int q=0;q<L;q++){
for(int w=0;w<H;w++)cin>>map[w][q]; //初始化地图
}
memset(vis,0,sizeof(vis)); //0代表未走过 1代表已走过
cin>>bx,by,ex,ey; //输入起终点
bfs();
cout<<ans<<endl; //输出最短步数
}
}
转载于:https://www.cnblogs.com/zhizhaozhuo/p/9594250.html