#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m,Map[1005][1005],vis[1005][1005];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int xx,yy,x2,y2;
bool flag;
bool check(int x,int y){
if(!vis[x][y]&&x>0&&y>0&&x<=n&&y<=m)
return true;
return false;
}
void dfs(int x,int y,int t,int cnt){
if(cnt>2)
return;
if(x!=xx||y!=yy){
if((x!=x2||y!=y2)&&Map[x][y]!=0) //不是终点,但是存在值,绕过
return;
if(cnt==2&&x!=x2&&y!=y2) //cnt==2,此时如果还没有找到,则必须停止,因为必须转折一次才能够找到终点
return;
}
if(x==x2&&y==y2){
flag=true;
return;
}
for(int i=0;i<4;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(check(nx,ny)){
if(x==xx&&y==yy){
vis[nx][ny]=1;
dfs(nx,ny,i,cnt);
vis[nx][ny]=0;
}
else {
vis[nx][ny]=1;
if(t!=i)
dfs(nx,ny,i,cnt+1);
else
dfs(nx,ny,i,cnt);
vis[nx][ny]=0;
}
}
}
}
int main(){
while(cin>>n>>m&&n){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&Map[i][j]);
}
}
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&xx,&yy,&x2,&y2);
memset(vis,0,sizeof(vis));
flag=false;
if(Map[xx][yy]==Map[x2][y2]&&Map[xx][yy]!=0){
dfs(xx,yy,0,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
else{
printf("NO\n");
}
}
}
return 0;
}
HDU - 1175 连连看 dfs+剪枝
最新推荐文章于 2021-04-17 12:07:26 发布