深搜+剪枝
#include<iostream>
#include<cstdio>
using namespace std;
int map[1010][1010];
int dir[4][2]={-1,0,1,0,0,-1,0,1};// 上下 左右
int flag;
int n,m;
int x1,x2,y1,y2;
void dfs(int x,int y,int k,int d)
{
int i,j;
int temp;
if(flag)
return ;
if(x==x2&&y==y2)
{
printf("YES\n");
flag=1;
return ;
}
if(map[x][y]==0&&x<n&&y<m&&x>=0&&y>=0&&k<=2)
{
if(k==0)
{
if(d==0||d==1)
{
if(y2-y<0)
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[2][0],y+dir[2][1],k+1,2);
map[x][y]=temp;
}
if(y2-y>0)
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[3][0],y+dir[3][1],k+1,3);
map[x][y]=temp;
}
if(y2==y)
{
if((x2-x<0&&d==1)||(x2-x>0&&d==0))
return ;
else
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[d][0],y+dir[d][1],k,d);
map[x][y]=temp;
}
}
}
if(d==2||d==3)
{
if(x2-x<0)
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[0][0],y+dir[0][1],k+1,0);
map[x][y]=temp;
}
if(x2-x>0)
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[1][0],y+dir[1][1],k+1,1);
map[x][y]=temp;
}
if(x2==x)
{
if(y2-y<0&&d==3||y2-y>0&&d==2)
return ;
else
{
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[d][0],y+dir[d][1],k,d);
map[x][y]=temp;
}
}
}
temp=map[x][y];
map[x][y]=-1;
dfs(x+dir[d][0],y+dir[d][1],k,d);
map[x][y]=temp;
}
if(k==1)
{
if(d==0||d==1)
{
while(x!=x2)
{
if(map[x][y]!=0)
return ;
x=x+dir[d][0];
y=y+dir[d][1];
}
if(y2-y>0)
{
while(y!=y2)
{
if(map[x][y]!=0)
return ;
x=x+dir[3][0];
y=y+dir[3][1];
}
}
if(y2-y<0)
{
while(y!=y2)
{
if(map[x][y]!=0)
return ;
x=x+dir[2][0];
y=y+dir[2][1];
}
}
if(y2==y)
{
printf("YES\n");
flag=1;
return ;
}
}
if(d==2||d==3)
{
while(y!=y2)
{
if(map[x][y]!=0)
return ;
x=x+dir[d][0];
y=y+dir[d][1];
}
if(x2-x>0)
{
while(x!=x2)
{
if(map[x][y]!=0)
return ;
x=x+dir[1][0];
y=y+dir[1][1];
}
}
if(x2-x<0)
{
while(x!=x2)
{
if(map[x][y]!=0)
return ;
x=x+dir[0][0];
y=y+dir[0][1];
}
}
if(y2==y)
{
printf("YES\n");
flag=1;
return ;
}
}
}
}
}
int main()
{
int i,j;
int q;
while(~scanf("%d%d",&n,&m)&&n+m)
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&map[i][j]);
scanf("%d",&q);
for(i=0;i<q;i++)
{
flag=0;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1--;
x2--;
y1--;
y2--;
if(map[x1][y1]==map[x2][y2]&&map[x1][y1]!=0&&map[x2][y2]!=0)
{
for(j=0;j<4;j++)
dfs(x1+dir[j][0],y1+dir[j][1],0,j);//i代表方向
if(!flag)
printf("NO\n");
}
else
printf("NO\n");
}
}
return 0;
}