提很简单,码量不多,但就是WA了...
#include <bits/stdc++.h>
using namespace std;
int n;
int hx,hy;
char sc;
int sx,sy;
int qp[15][15];//0:安全格 1:不安全且无棋 与 不安全且有棋 2:安全且有棋
bool q[15][15];
int mx[]={-2,-2, 2, 2, 1,-1, 1,-1};
int my[]={ 1,-1, 1,-1, 2, 2,-2,-2};
int bx[]={-1,-1, 1, 1, 0, 0, 0, 0};
int by[]={ 0, 0, 0, 0, 1, 1,-1,-1};
void tj(char c,int x,int y){
if(c=='R'){
for(int i=x-1;i>0;i--){
qp[i][y]=1;
if(q[i][y]) break;
}
for(int i=x+1;i<=10;i++){
qp[i][y]=1;
if(q[i][y]) break;
}
for(int j=y-1;j>0;j--){
qp[x][j]=1;
if(q[x][j]) break;
}
for(int j=y+1;j<=9;j++){
qp[x][j]=1;
if(q[x][j]) break;
}
q[x][y]=1;
qp[x][y]=2;
}else if(c=='H'){
for(int l=0;l<8;l++){
int mxx=x+mx[l],myx=y+my[l];
int bxx=x+bx[l],byx=y+by[l];
if(!q[bxx][byx]){
if(0<mxx&&mxx<=10&&0<myx&&myx<=9){
qp[mxx][myx]=1;
}
}
}
q[x][y]=1;
qp[x][y]=2;
}else{
bool fs=0;
for(int i=x-1;i>0;i--){
if(!fs&&q[i][y]){ fs=1;continue; }
if(fs) qp[i][y]=1;
if(fs&&q[i][y]) break;
}
fs=0;
for(int i=x+1;i<=10;i++){
if(!fs&&q[i][y]){ fs=1;continue; }
if(fs) qp[i][y]=1;
if(fs&&q[i][y]) break;
}
fs=0;
for(int j=y-1;j>0;j--){
if(!fs&&q[x][j]){ fs=1;continue; }
if(fs) qp[x][j]=1;
if(fs&&q[x][j]) break;
}
fs=0;
for(int j=y+1;j<=9;j++){
if(!fs&&q[x][j]){ fs=1;continue; }
if(fs) qp[x][j]=1;
if(fs&&q[x][j]) break;
}
q[x][y]=1;
qp[x][y]=2;
}
}
int main(){
while(1){
scanf("%d%d%d",&n,&hx,&hy);
if(n==0&&hx==0&&hy==0) break;
for(int i=1;i<=10;i++) for(int j=1;j<=9;j++){ qp[i][j]=0;q[i][j]=0; }
q[hx][hy]=1;
q[10][5]=1;
tj('R',10,5);
for(int i=1;i<=n;i++){
scanf("\n%c%d%d",&sc,&sx,&sy);
tj(sc,sx,sy);
}
bool can=0;
for(int i=0;i<8;i+=2){//巧妙的用一下bx与by数组
int aox=hx+bx[i],aoy=hy+by[i];
if(0<aox&&aox<=3&&4<=aoy&&aoy<=6){
if(qp[aox][aoy]!=1){
can=1;
break;
}
}
}
if(!can) printf("YES\n\n");
else printf("NO\n\n");
}
return 0;
}
刚好一百行,真的不多