有看不明白的地方评论问我,看到必回。
#include<iostream>
#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;
}