写写写。。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
int n, bx, by, rx, ry;
struct node{
char c;
int x, y;
}a[20];
int mp[20][20], ok[20][20], step[4][2] = {0,1,0,-1,1,0,-1,0};
bool inmap(int x, int y){return 1<=x && x<=10 && 1<=y && y<=9;}
void mark(int x, int y){
if(1<=x && x<=10 && 1<=y && y<=10)
ok[x][y] = 1;
}
void che(int x, int y){
for(int i = x-1; i >= 1; i--)
{
mark(i,y);
if(mp[i][y])break;
}
for(int i = x+1; i <= 10; i++)
{
mark(i,y);
if(mp[i][y])break;
}
for(int i = y-1; i >= 1; i--)
{
mark(x, i);
if(mp[x][i])break;
}
for(int i = y+1; i <= 9; i++)
{
mark(x, i);
if(mp[x][i])break;
}
}
void pao(int x, int y){
bool hav = false;
for(int i = x-1; i >= 1; i--)
{
if(hav == false)
{
if(mp[i][y])
hav = 1;
}
else
{
mark(i,y);
if(mp[i][y])break;
}
}
hav = false;
for(int i = x+1; i <= 10; i++)
{
if(hav == false)
{
if(mp[i][y])
hav = 1;
}
else
{
mark(i,y);
if(mp[i][y])break;
}
}
hav = false;
for(int i = y-1; i >= 1; i--)
{
if(hav == false)
{
if(mp[x][i])
hav = 1;
}
else
{
mark(x, i);
if(mp[x][i])break;
}
}
hav = false;
for(int i = y+1; i <= 9; i++)
{
if(hav == false)
{
if(mp[x][i])
hav = 1;
}
else
{
mark(x, i);
if(mp[x][i])break;
}
}
}
void ma(int x, int y){
for(int i = 0; i < 4; i++)
{
int nx = step[i][0] + x, ny = step[i][1] + y;
if(!inmap(nx, ny) || mp[nx][ny])continue;
if(step[i][0])
{
nx += step[i][0];
mark(nx, ny-1);
mark(nx, ny+1);
}
else
{
ny += step[i][1];
mark(nx-1, ny);
mark(nx+1, ny);
}
}
}
void debug(){
printf("red:(%d,%d) black:(%d,%d)\n", rx, ry, bx, by);
puts("****have****");
for(int i = 1; i <= 10; i++){
for(int j = 1; j <= 9; j++)
printf("%d", mp[i][j]);
puts("");
}
puts("****kill****");
for(int i = 1; i <= 10; i++){
for(int j = 1; j <= 9; j++)
printf("%d", ok[i][j]);
puts("");
}
}
bool work(){
if(by == ry)
{
bool hehe = false;
for(int i = bx+1; i < rx; i++)
if(mp[i][by])
hehe = true;
if(hehe == false){ return false; }
}
che(rx, ry);
for(int i = 1; i <= n; i++)
{
if(a[i].c == 'R')
che(a[i].x, a[i].y);
else if(a[i].c == 'H')
ma(a[i].x, a[i].y);
else if(a[i].c == 'C')
pao(a[i].x, a[i].y);
}
// debug();
for(int i = 0; i < 4; i++)
{
int nx = step[i][0] + bx, ny = step[i][1] + by;
if(1<=nx && nx <= 3 && 4<=ny && ny<=6)
if(ok[nx][ny] == 0)
return false;
}
return true;
}
void input(){
memset(ok, 0, sizeof ok);
memset(mp, 0, sizeof mp); char S[2];
for(int i = 1; i <= n; i++)
{
scanf("%s %d %d", S, &a[i].x , &a[i].y);
a[i].c = S[0];
mp[a[i].x][a[i].y] = 1;
if(a[i].c == 'G')
{
rx = a[i].x; ry = a[i].y;i--;n--;
}
}
}
int main() {
while(cin>>n>>bx>>by,n+bx+by) {
input();
if(work())puts("YES");
else puts("NO");
}
return 0;
}
/*
1 1 4
G 10 4
2 1 4
H 5 4
G 10 4
2 1 4
G 10 6
H 3 6
3 1 4
G 10 5
H 2 4
C 3 4
3 1 4
G 10 5
C 2 4
C 3 4
*/