#include<stdio.h>
#pragma comment(linker,"/STACK:102400000,102400000")
int grap[1010][1010];
int flag;
int n,m,a,b;
void dfs(int x,int y,int dir,int co){
if(flag||co>2)return;
if(x<0||x>=n||y<0||y>=m)return;
if(x==a&&y==b){flag=1;return;}
if(grap[x][y]!=0)return;
if(co==2&&(a-x)&&(b-y))return;//强剪枝,最大拐弯但目标不在一条线上,return
grap[x][y]=1;
dfs(x-1,y,0,co+(dir==0?0:1));
dfs(x,y-1,1,co+(dir==1?0:1));
dfs(x+1,y,2,co+(dir==2?0:1));
dfs(x,y+1,3,co+(dir==3?0:1));
grap[x][y]=0;
}
int main(){
int i,j,q,x1,y1,x2,y2;
while(scanf("%d%d",&n,&m),n||m){
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&grap[i][j]);
}
}
scanf("%d",&q);
for(i=0;i<q;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
flag=0;
x1=x1-1;y1=y1-1;a=x2-1;b=y2-1;
if(grap[x1][y1]!=grap[a][b])printf("NO\n");
else if(grap[x1][y1]==0)printf("NO\n");
else{
dfs(x1-1,y1,0,0);
dfs(x1,y1-1,1,0);
dfs(x1+1,y1,2,0);
dfs(x1,y1+1,3,0);
if(flag)printf("YES\n");
else printf("NO\n");
}
}
}
return 0;
}
Hd1175 dfs强剪枝
最新推荐文章于 2021-04-09 22:06:33 发布