从起床写到现在,情况太多了,写出的代码也很长,不过思路很容易想。

   第一次交的时候忘了讨论马走的几种情况,第二次改过来了,结果忘了加judge的返回值,导致如果没对应的情况话返回值为非0。第三次AC了,代码真的略长。。。不容易。



#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char red[15][15], black[15][15];
int judge(char a[15][15], int x, int y) {
    int sign = 0;
    for(int i = x + 1; i < 11; i++) {              //两将相遇情况
        if(a[i][y])
            sign++;
        if(a[i][y] == 'G'&& sign == 1)
            return 1;
        else if(sign > 1)
            break;
    }
    sign = 0;
    for(int i = x - 1; i > 0; i--) {               //黑将上方车能否将军
        if(a[i][y])
            sign++;
        if(a[i][y] == 'R'&& sign == 1)
            return 1;
        else if(sign > 1)
            break;
    }
    sign = 0;
    for(int i = x + 1; i < 11; i++) {              //黑将下方车能否将军
        if(a[i][y])
            sign++;
        if(a[i][y] == 'R'&& sign == 1)
            return 1;
        else if(sign > 1)
            break;
    }
    sign = 0;
    for(int i = y - 1; i > 0; i--) {               //黑将左边车能否将军
        if(a[x][i])
            sign++;
        if(a[x][i] == 'R'&& sign == 1)
            return 1;
        else if(sign > 1)
            break;
    }
    sign = 0;
    for(int i = y + 1; i < 10; i++) {              //黑将右边车能否被将军
        if(a[x][i])
            sign++;
        if(a[x][i] == 'R'&& sign == 1)
            return 1;
        else if(sign > 1)
            break;
    }
    sign = 0;
    for(int i = x - 1; i > 0; i--) {               //黑将上方炮能否将军
        if(a[i][y])
            sign++;
        if(a[i][y] == 'C'&& sign == 2)
            return 1;
        else if(sign > 2)
            break;
    }
    sign = 0;
    for(int i = x + 1; i < 11; i++) {              //黑将下方炮能否将军
        if(a[i][y])
            sign++;
        if(a[i][y] == 'C'&& sign == 2)
            return 1;
        else if(sign > 2)
            break;
    }
    sign = 0;
    for(int i = y - 1; i > 0; i--) {               //黑将左边炮能否将军
        if(a[x][i])
            sign++;
        if(a[x][i] == 'C'&& sign == 2)
            return 1;
        else if(sign > 2)
            break;
    }
    sign = 0;
    for(int i = y + 1; i < 10; i++) {              //黑将右边炮能否被将军
        if(a[x][i])
            sign++;
        if(a[x][i] == 'C'&& sign == 2)
            return 1;
        else if(sign > 2)
            break;
    }
    if(x - 1) {                                    //黑将上方马能否将军
        if(!a[x - 1][y - 1])                       //黑将左上马能否将军
            if(a[x - 1][y - 2] == 'H')
            return 1;
        if(!a[x - 1][y + 1])                       //黑将右上马能否将军
            if(a[x - 1][y + 2] == 'H')
            return 1;
    }
    if(x - 2) {                                    //黑将上方马能否将军
        if(!a[x - 1][y - 1])                       //黑将左上马能否将军
            if(a[x - 2][y - 1] == 'H')
            return 1;
        if(!a[x - 1][y + 1])                       //黑将右上马能否将军
            if(a[x - 2][y + 1] == 'H')
            return 1;
    }
    if(!a[x + 1][y - 1]) {                           //黑将左下马能否将军
        if(a[x + 1][y - 2] == 'H')
            return 1;
        if(a[x + 2][y - 1] == 'H')
            return 1;
    }
    if(!a[x + 1][y + 1]) {                           //黑将右下马能否将军
        if(a[x + 1][y + 2] == 'H')
            return 1;
        if(a[x + 2][y + 1] == 'H')
            return 1;
    }
    return 0;
}
int black_move(int x, int y) {
    if(x - 1 > 0)
        if(!judge(red, x - 1, y))
            return 0;
    if(x + 1 < 4)
        if(!judge(red, x + 1, y))
            return 0;
    if(y - 1 > 3)
        if(!judge(red, x, y - 1))
            return 0;
    if(y + 1 < 7)
        if(!judge(red, x, y + 1))
            return 0;
    return 1;
}
int main() {
    int a, b, c;
    char piece;
    int ro, ac;                                     //ro为纵ac为横
    while(cin >> a >> b >> c&& a) {
        memset(red, 0, sizeof(red));
        memset(black, 0, sizeof(black));
        black[b][c] = 'G';
        while(a--) {
            cin >> piece >> ro >> ac;
            red[ro][ac] = piece;
        }
        if(black_move(b, c))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}