与1728类似,但写出来后一直超时。。。
最后把数组改为1001(原来为1024),就AC了。。
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int map[1001][1001];
int v[1001][1001];
int n,m,t,ex,ey,sx,sy;
struct node
{
int x,y,step;
};
bool judge(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m&&
(map[x][y]==0||(x==ex&&y==ey)))
return 1;
return 0;
}
void bfs()
{
memset(v,0,sizeof(v));
queue<node>Q;
int i,xx,yy;
node s,e;
s.x=sx;
s.y=sy;
s.step=-1;
v[s.x][s.y]=1;
Q.push(s);
while(!Q.empty())
{
s=Q.front();
Q.pop();
for(i=0;i<4;i++)
{
xx=s.x+dir[i][0];
yy=s.y+dir[i][1];
while(judge(xx,yy))
{
if(v[xx][yy]==0)
{
v[xx][yy]=1;
e.x=xx;
e.y=yy;
e.step=s.step+1;
Q.push(e);
if(e.x==ex&&e.y==ey&&e.step<=2)
{
printf("YES\n");
return ;
}
}
xx+=dir[i][0];
yy+=dir[i][1];
}
}
}
printf("NO\n");
return ;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m),n+m)
{
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",&sx,&sy,&ex,&ey);
if((sx==ex&&sy==ey)||map[sx][sy]==0
||map[ex][ey]==0||map[sx][sy]!=map[ex][ey])
printf("NO\n");
else
bfs();
}
}
return 0;
}