简单的DFS,单方向搜索,换方向时次数加一。
#include<iostream>
#include"string.h"
using namespace std;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
int n,m,num[1001][1001],flag[1001][1001],x1,x2,yy1,y2,solve,t;
void dfs(int x,int y,int cnt,int fx){
int dx,dy;
if(solve) return ;
if(cnt > 2) return ;
if(cnt == 2 && x != x2 && y != y2) return ;
if(cnt <= 2 && x == x2 && y == y2){
solve = 1;
return ;
}
for(int i = 0;i<4;i++){
dx = x + dir[i][0];
dy = y + dir[i][1];
if(dx <= 0 || dx > n || dy <= 0 || dy > m)
continue;
if(dx == x2 && dy == y2)
;
else if(num[dx][dy] != 0)
continue;
if(flag[dx][dy] == 1)
continue;
if(fx < 0)
;
else if(i != fx) cnt++;
flag[dx][dy] = 1;
dfs(dx,dy,cnt,i);
flag[dx][dy] = 0;
if(i != fx && fx != -1) cnt--;
}
}
int main(){
while(scanf("%d %d",&n,&m),n,m){
memset(flag,0,sizeof(flag));
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
scanf("%d",&num[i][j]);
scanf("%d",&t);
while(t--){
scanf("%d %d %d %d",&x1,&yy1,&x2,&y2);
if(x1 == x2 && yy1 == y2){
printf("NO\n");
continue;
}
if(num[x1][yy1] != num[x2][y2] || num[x1][yy1] == 0 || num[x2][y2] == 0){
printf("NO\n");
continue;
}
solve = 0;
flag[x1][yy1] = 1;
dfs(x1,yy1,0,-1);
flag[x1][yy1] = 0;
if(solve) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}