感觉比较简单的一道题,思路清晰,就是考验代码的实现能力。
关键是要定义一个变量来记录方向的改变。。。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int mi=1005;
int map[mi][mi];
int vis[mi][mi];
int divs[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int m,n;
int flag;
int si,sj,ei,ej;
struct step
{
int x,y;
int fang;
int ci;
};
void bfs()
{
flag=0;
queue<step> Q;
step p,q;
p.x=si;
p.y=sj;
p.fang=-1;
p.ci=0;
Q.push(p);
vis[p.x][p.y]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=0; i<4; i++)
{
q.x=p.x+divs[i][0];
q.y=p.y+divs[i][1];
q.fang=i;
if(p.fang!=-1)
{
if(p.fang==i)
q.ci=p.ci;
else
q.ci=p.ci+1;
}
else
q.ci=0;
if(q.x==ei&&q.y==ej)
{
if(q.ci<=2&&q.ci>=0)
{
flag=1;
break;
}
}
if(q.x>=0&&q.y>=0&&q.x<n&&q.y<m&&map[q.x][q.y]==0&&vis[q.x][q.y]>q.ci)
{
Q.push(q);
vis[q.x][q.y]=q.ci;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),n+m)
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
scanf("%d",&map[i][j]);
int t;
int a,b,c,d;
scanf("%d",&t);
while(t--)
{
memset(vis,3,sizeof(vis));
scanf("%d%d%d%d",&a,&b,&c,&d);
si=a-1;
sj=b-1;
ei=c-1;
ej=d-1;
if(map[si][sj]==map[ei][ej]&&map[si][sj]&&map[ei][ej])
{
bfs();
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
}
return 0;
}