#include#include #include #include #define MAXN 1005 using namespace std; int map[MAXN][MAXN],v[MAXN][MAXN]; const int dx[4] = {0,1,0,-1}; const int dy[4] = {-1,0,1,0}; int n,m,flag; struct node { int x,y; int dir;//记录方向 int step;//记录转弯次数 }; int bfs(int x1,int y1,int x2,int y2) { memset(v,1,sizeof(v)); queue q; node s,temp; s.x = x1; s.y = y1; s.dir = -1;//-1表示朝哪个方向都可以 s.step = 0; q.push(s); while(!q.empty()) { temp = q.front(); q.pop(); if(temp.x == x2 && temp.y == y2 && temp.step <= 2) return 1; for(int i = 0; i < 4; i ++) { s = temp; s.x += dx[i]; s.y += dy[i]; if(s.x >= 1 && s.x <= n && s.y >= 1 && s.y <= m && (map[s.x][s.y] == 0 || (s.x == x2 && s.y == y2))) { if(s.dir != -1) { if(s.dir != i) { s.dir = i; s.step ++; } } else s.dir = i; if(s.step > 2) continue; if(s.step <= v[s.x][s.y])//保证转弯次数最少,等号不能忘记 { v[s.x][s.y] = s.step; q.push(s); } } } } return 0; } int main() { int i,j,t,x1,y1,x2,y2; while(scanf("%d%d",&n,&m),(n+m)) { for(i = 1; i <= n; i ++) for(j = 1; j <= m; j ++) scanf("%d",&map[i][j]); scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(!map[x1][y1] || !map[x2][y2] || map[x1][y1] != map[x2][y2] || (x1 == x2 && y1 == y2) ) flag = 0; else flag = bfs(x1,y1,x2,y2); if(flag) puts("YES"); else puts("NO"); } } return 0; }