#include<string.h>
using namespace std;
int out(int x,int y)//返回1说明黑将出了九宫格
{
if((y==4||y==5||y==6)&&(x==1||x==2||x==3))return 0;
else return 1;
}
void algo(int map[20][20],int gx1,int gy1)
{
int row[2][4]={0,0,1,-1,
1,-1,0,0};//四个方向 黑将的上下左右四种走法
int gx,gy;
for(int q=0;q<4;q++)
{
int cun;
gx=gx1+row[0][q];
gy=gy1+row[1][q];
cun=map[gx][gy];
map[gx][gy]=0; //黑将走一步会吃掉红方的子,(gx,gy)不在九宫格也没关系,记住一会要把这个值变回来map[gx][gy]=cun;
if(!out(gx,gy))
{
for(int i=1;i<=10;i++)//行
{
for(int j=1;j<=9;j++)//列
{
if(map[i][j]==0)continue;
if(map[i][j]=='G'&&j==gy)//位置i,j是红将 并且与黑将在同一条竖线上
{
int mark=0;
for(int k=i-1;k>gx;k--)
if(map[k][j]!=0)mark=1;//看看两个将之间有没有子
if(!mark)goto abc;//如果没有子说明这种走法行不通
}
if(map[i][j]=='H'&&i<=5)//i<5也可以不写
{
if(i-2==gx&&map[i-1][j]==0&&(j-1==gy||j+1==gy))goto abc;//马能不能吃到
if(i+2==gx&&map[i+1][j]==0&&(j-1==gy||j+1==gy))goto abc;
if(j-2==gy&&map[i][j-1]==0&&(i-1==gx||i+1==gx))goto abc;
if(j+2==gy&&map[i][j+1]==0&&(i-1==gx||i+1==gx))goto abc;
}
if(map[i][j]=='R'&&(i==gx||j==gy))
{
if(i==gx)
{
int mark=0;
int min=j<gy?j:gy;
int max=j<gy?gy:j;
for(int k=min+1;k<max;k++)
if(map[i][k])mark=1;
if(!mark)goto abc;
}
if(j==gy)
{
int mark=0;
int min=i<gx?i:gx;
int max=i<gx?gx:i;
for(int k=min+1;k<max;k++)
if(map[k][j])mark=1;
if(!mark)goto abc;
}
}
if(map[i][j]=='C'&&(i==gx||j==gy))
{
if(i==gx)
{
int mark=0;
int min=j<gy?j:gy;
int max=j<gy?gy:j;
for(int k=min+1;k<max;k++)
if(map[i][k])mark++;
if(mark==1)goto abc;
}
if(j==gy)
{
int mark=0;
int min=i<gx?i:gx;
int max=i<gx?gx:i;
for(int k=min+1;k<max;k++)
if(map[k][j])mark++;
if(mark==1)goto abc;
}
}
}
}
cout<<"NO"<<'\n';//能到此处说明黑将在这种走法下不会被吃,所以没将死,输出NO并且结束函数
return;
}
abc:map[gx][gy]=cun;
}
cout<<"YES"<<'\n';//无论黑将怎么走都被吃
}
int main()
{
int map[20][20];
int counts,gx,gy,tx,ty;
char type;
while(cin>>counts>>gx>>gy)
{
if(counts==0&&gx==0&&gy==0)break;
memset(map,0,sizeof(map));
while(counts--)
{
cin>>type>>tx>>ty;
map[tx][ty]=type;
}
algo(map,gx,gy);
}
return 0;
}