#include<stdio.h> #include<string.h> #include<queue> using namespace std;
const int dir[][2]={{0,1},{1,0},{-1,0},{0,-1}}; const int Maxn=1001;
struct point { int x,y; int num; //记录偏转次数
int from; //记录访问该点的方向
point(){} };
int g[Maxn][Maxn]; bool visit[Maxn][Maxn]; bool exist;
int main() { int n,m; while(scanf("%d%d",&n,&m),n) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",g[i]+j);
int cases; scanf("%d",&cases); while(cases--) { point start,end; scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y); start.x--;start.y--; end.x--;end.y--;
exist=false; if(g[start.x][start.y]==g[end.x][end.y]&&g[start.x][start.y]!=0) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) visit[i][j]=0;
start.from=-1;
queue<point> que; que.push(start); while(!que.empty()) { point temp=que.front(); que.pop(); if(temp.x==end.x&&temp.y==end.y) { exist=true; break; }
for(int i=0;i<4;i++) { point cur; cur.x=temp.x+dir[i][0]; cur.y=temp.y+dir[i][1]; if(cur.x<0||cur.x>=n||cur.y<0||cur.y>=m) continue; if(visit[cur.x][cur.y]) continue; if(g[cur.x][cur.y]!=0&&!(cur.x==end.x&&cur.y==end.y)) continue; //过滤出g[i][j]=0或end点
if(i==temp.from) { cur.num=temp.num; cur.from=i; visit[cur.x][cur.y]=1; que.push(cur); } else { if(temp.from==-1) { cur.num=1; cur.from=i; visit[cur.x][cur.y]=1; que.push(cur); } else if(temp.num<3) { cur.num=temp.num+1; cur.from=i; visit[cur.x][cur.y]=1; que.push(cur); } } } } } if(exist) printf("YES\n"); else printf("NO\n"); } } return 0; }
|