最后In Check的棋子来自king 8个方向中的最近的棋子 保留该棋子 最后在判断下即可
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int N=5e5+20;
struct point{
char kind;
int x,y;
}near[8];//因为不能Leap,保留king8个方向中最近的棋子即可
int x0,y0;
int Dir(point cur)
{
if(cur.x==x0&&cur.y<y0) return 0;//hor 上下
if(cur.x==x0&&cur.y>y0) return 1;//
if(cur.y==y0&&cur.x<x0) return 2;//ver 左右方
if(cur.y==y0&&cur.x>x0) return 3;//
if(x0+y0==cur.x+cur.y&&cur.y<y0) return 4;//主对角线下方
if(x0+y0==cur.x+cur.y&&cur.y>y0) return 5;//主对角线上方
if(x0-y0==cur.x-cur.y&&cur.y<y0) return 6;//副对角线上
if(x0-y0==cur.x-cur.y&&cur.y>y0) return 7; //副下
return -1;//不在8个方向上
}
int dist(int a,int b)//切比雪夫距离
{
return max(abs(x0-a),abs(y0-b));
}
void update(point& old,point cur)
{
if(old.kind=='?'||dist(cur.x,cur.y)<dist(old.x,old.y))
{
old=cur;
}
}
int main()
{
int n;
cin>>n;
cin>>x0>>y0;
for(int i=0;i<8;i++)
{
near[i].kind='?';
}
for(int i=0;i<n;i++)
{
point cur;
cin>>cur.kind>>cur.x>>cur.y;
int dir=Dir(cur);//判断该点是否在king的8个方向上
if(dir>=0)
{
update(near[dir],cur);//更新该方向上的最近点
}
}
bool flag=false;
for(int i=0;i<8;i++)
{
if(i<4&&(near[i].kind=='R'||near[i].kind=='Q'))
{
flag=true;
break;
}
if(i>=4&&(near[i].kind=='B'||near[i].kind=='Q'))
{
flag=true;
break;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}