#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e5+4;
struct Node
{
int x,y;
int dis;
};
vector<int> vec[maxn];
vector<bool> book[maxn];
int n,m,sx,sy,ex,ey;
int dirx[]={0,0,-1,1};
int diry[]={-1,1,0,0};
bool judge(int x,int y)
{
if(x<1||x>n||y<1||y>m||book[x][y]) return false;
return true;
}
int bfs()
{
queue<Node> que;
Node start;
start.x=sx;
start.y=sy;
start.dis=0;
que.push(start);
book[sx][sy]=true;
while(!que.empty()){
start=que.front();
que.pop();
int state=vec[start.x][start.y]; //当前状态
if(start.dis%2){ //奇数步灯状态改变
if(state) state=0;
else state=1;
}
if(state==0){ //判断走的方式
Node tmp;
for(int i=2;i<4;i++){
tmp.x=start.x+dirx[i];
tmp.y=start.y+diry[i];
tmp.dis=start.dis+1;
if(tmp.x==ex&&tmp.y==ey) return tmp.dis;
if(judge(tmp.x,tmp.y)){
book[tmp.x][tmp.y]=true;
que.push(tmp);
}
}
}
else{
Node tmp;
for(int i=0;i<2;i++){
tmp.x=start.x+dirx[i];
tmp.y=start.y+diry[i];
tmp.dis=start.dis+1;
if(tmp.x==ex&&tmp.y==ey) return tmp.dis;
if(judge(tmp.x,tmp.y)){
book[tmp.x][tmp.y]=true;
que.push(tmp);
}
}
}
}
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){ //初始化
vec[i].clear();
book[i].clear();
}
for(int i=1;i<=n;i++){
vec[i].push_back(0);
book[i].push_back(false);
for(int j=1;j<=m;j++){
int x;
scanf("%d",&x);
vec[i].push_back(x);
book[i].push_back(false);
}
}
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(sx==ex&&sy==ey) printf("0\n");
else printf("%d\n",bfs());
}
// getchar();getchar();
return 0;
}
zoj 4020 bfs
最新推荐文章于 2019-04-27 16:43:00 发布