还以为是 广搜,写完以后才发现模拟 = =
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
#define LL long long
#define N 1000005
struct node
{
int x;
int y;
int dr;
};
int vis[505][505][4];
int all[505][505];
int dx[505][505];
int dy[505][505];
// 0下 1左 2上 3右
int dr[]={1,4,3,2};
int drx[]={0,-1,0,1};
int dry[]={1,0,-1,0};
int r,c;
int ans;
bool judge(int dir,int x,int y)
{
if(dir==0)
{
if(dy[y][x]==0)
return true;
}
else if(dir==1)
{
if(dx[y][x-1]==0)
return true;
}
else if(dir==2)
{
if(dy[y-1][x]==0)
return true;
}
else
{
if(dx[y][x]==0)
return true;
}
return false;
}
void BFS(int stx,int sty,int edx,int edy,int sdir)
{
queue<node> q;
memset(vis,0,sizeof(vis));
node tnode;
tnode.x=stx;
tnode.y=sty;
tnode.dr=sdir;
vis[stx][sty][sdir]=1;
q.push(tnode);
while(!q.empty())
{
node f=q.front();
//printf("%d %d\n",f.y-1,f.x-1);
q.pop();
ans+=(all[f.x][f.y]==0?1:0);
all[f.x][f.y]=1;
for(int i=0;i<4;i++)
{
int tox=drx[(dr[i]+f.dr)%4]+f.x;
int toy=dry[(dr[i]+f.dr)%4]+f.y;
if(tox==edx&&toy==edy)
{
break;
}
if(tox==0||toy==0||tox>c||toy>r)continue;
int dir=(dr[i]+f.dr)%4;
if(!judge(dir,f.x,f.y))continue;
if(!vis[tox][toy][dir])
{
tnode.x=tox;
tnode.y=toy;
tnode.dr=dir;
q.push(tnode);
vis[tox][toy][dir]=1;
}
break;
}
}
}
int main()
{
int t,s,e;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&r,&c,&s,&e);
for(int i=0;i<r*2-1;i++)
{
if(i%2==0)
{
for(int j=1;j<=c-1;j++)
{
scanf("%d",&dx[i/2+1][j]);
}
}
else
{
for(int j=1;j<=c;j++)
{
scanf("%d",&dy[i/2+1][j]);
}
}
}
ans=0;
memset(all,0,sizeof(all));
BFS(s+1,1,e+1,r+1,0);
BFS(e+1,r,s+1,0,2);
if(ans==r*c)
puts("YES");
else
puts("NO");
}
return 0;
}