题意:
国际象棋规则,看黑方是否被将军
题解:
八个方向上把最近的点都记下来看看能不能凑合,有一个能凑合就可以输出YES,不然GG
#include<iostream>
#include<cmath>
using namespace std;
const long long INF=1e10+1;
struct S{
char ch;
long long x,y;
S(){}
S(long long x,long long y){
this->x=x;
this->y=y;
}
}s[501000];
long long nearest[8];
int bit[8];
int main(){
long long n;
cin>>n;
long long x,y;
cin>>x>>y;
for(int i=0;i<n;i++){
cin>>s[i].ch>>s[i].x>>s[i].y;
}
for(int i=0;i<8;i++) bit[i]=-1;
for(int i=0;i<8;i++) nearest[i]=INF;
for(int i=0;i<n;i++){
long long disx=abs(s[i].x-x);
long long disy=abs(s[i].y-y);
if(s[i].x<x&&s[i].y==y&&disx<nearest[0]){
nearest[0]=disx;
bit[0]=i;
}
if(s[i].x>x&&s[i].y==y&&disx<nearest[1]){
nearest[1]=disx;
bit[1]=i;
}
if(s[i].x==x&&s[i].y<y&&disy<nearest[2]){
nearest[2]=disy;
bit[2]=i;
}
if(s[i].x==x&&s[i].y>y&&disy<nearest[3]){
nearest[3]=disy;
bit[3]=i;
}
if(disx!=disy) continue;
if(s[i].x<x&&s[i].y<y&&disx<nearest[4]){
nearest[4]=disx;
bit[4]=i;
}
if(s[i].x<x&&s[i].y>y&&disx<nearest[5]){
nearest[5]=disx;
bit[5]=i;
}
if(s[i].x>x&&s[i].y<y&&disx<nearest[6]){
nearest[6]=disx;
bit[6]=i;
}
if(s[i].x>x&&s[i].y>y&&disx<nearest[7]){
nearest[7]=disx;
bit[7]=i;
}
}
for(int i=0;i<8;i++){
int x=bit[i];
if(x==-1) continue;
if(i<4){
if(s[x].ch=='Q'||s[x].ch=='R'){
cout<<"YES"<<endl;
return 0;
}
}
else{
if(s[x].ch=='Q'||s[x].ch=='B'){
cout<<"YES"<<endl;
return 0;
}
}
}
cout<<"NO"<<endl;
}