题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175
题目大意:看起点和终点的路径的拐弯数是否<=2;和上一篇hdu 1278类似。
注意:1.起点和终点不能为0 2.起点和终点必须一样 3.vis每次查询前要清0 4.理论上,起点和终点应该不是同一点,但这道题的数据好i型那个没考虑这
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
int x,y,k;
};
int n,m,vis[1001][1001],map[1001][1001];
int a,b,c,d,t;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void bfs(node vs,node vd)
{
int flag=0;
queue<node>q;
node vw,vn;
vs.k=-1;
q.push(vs);
vis[vs.x][vs.y]=1;
while(!q.empty())
{
vn=q.front();
q.pop();
if(vn.x==vd.x&&vn.y==vd.y&&vn.k<=2)
{
flag=1;break;
}
vw.k=vn.k+1;
if(vw.k>2)
break;
for(int i=0;i<4;i++)
{
vw.x=vn.x+dx[i];
vw.y=vn.y+dy[i];
if(vw.x==vd.x&&vw.y==vd.y&&vw.k<=2)
{
printf("YES\n");
return;
}
while(vw.x>=1&&vw.x<=n&&vw.y>=1&&vw.y<=m&&(map[vw.x][vw.y]==0))
{
if(!vis[vw.x][vw.y])
{
vis[vw.x][vw.y]=1;
q.push(vw);
}
vw.x+=dx[i];
vw.y+=dy[i];
if(vw.x==vd.x&&vw.y==vd.y&&vw.k<=2)
{
printf("YES\n");
return;
}
}
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
else
{
int i,j;
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",&a,&b,&c,&d);
node vs,vd;
vs.x=a;
vs.y=b;
vd.x=c;
vd.y=d;
if(a==c&&b==d)
{
printf("NO\n");
continue;
}
if(map[a][b]!=map[c][d])
{
printf("NO\n");
continue;
}
if(map[a][b]==0||map[c][d]==0)
{
printf("NO\n");
continue;
}
else
{
memset(vis,0,sizeof(vis));
bfs(vs,vd);
}
}
}
}
return 0;
}