WA了若干次。。。。。不知道什么原因,又不知道改了哪里又过了
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m;
int q;
int x1,y1,x2,y2;
int dirX[]={-1,0,1,0};
int dirY[]={0,1,0,-1};
typedef struct
{
int x,y;
int cross;
int dir;
}node;
int map[1001][1001];
int dp[1001][1001];
bool check(node p)
{
if(p.x > 0 && p.x <= n && p.y > 0 && p.y <= m && p.cross <= 2)
{
return true;
}
return false;
}
bool BFS(int xs,int ys,int xe,int ye)
{
if(map[xs][ys]!=map[xe][ye]||!map[xs][ys]||!map[xe][ye]||(xs == xe && ys == ye))
return false;
memset(dp,0x3f3f3f,sizeof(dp));
queue<node> que;
node curnode,newnode;
curnode.x = xs;
curnode.y = ys;
curnode.cross = 0;
curnode.dir = -1;
dp[xs][ys] = 0;
for(int i = 0; i < 4; i++)
{
newnode = curnode;
newnode.x += dirX[i];
newnode.y += dirY[i];
if(check(newnode))
{
if(newnode.x == xe || newnode.y == ye )
{
return true;
}
newnode.dir = i;
if(!map[newnode.x][newnode.y])
{
que.push(newnode);
dp[newnode.x][newnode.y]=0;
}
}
}
while(!que.empty())
{
curnode = que.front();
que.pop();
for(int i = 0; i < 4; i++)
{
newnode = curnode;
newnode.x += dirX[i];
newnode.y += dirY[i];
newnode.dir = i;
if(curnode.dir != newnode.dir)
{
newnode.cross ++;
}
if(check(newnode)&&newnode.cross <= dp[newnode.x][newnode.y])
{
if(newnode.x == xe && newnode.y == ye)
{
return true;
}
if(!map[newnode.x][newnode.y])
{
que.push(newnode);
dp[newnode.x][newnode.y] = newnode.cross;
}
}
}
}
return false;
}
int main()
{
while(cin>>n>>m)
{
if(n == 0 && m == 0)
{
break;
}
memset(map,0,sizeof(map));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin>>map[i][j];
}
}
cin>>q;
for(int i = 0; i < q; i++)
{
cin>>x1>>y1>>x2>>y2;
if(BFS(x1,y1,x2,y2) == true)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
}
return 0;
}