天天看點

HDU 4121 Xiangqi 模拟題(水

寫寫寫。。

#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


*/