挺恶心的模拟,卡了好长时间。。
code:
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
char map[15][15];
int n,bi,bj;
struct node
{
bool flag;
char name;
int x,y;
}p[15];
bool HorseEat(int i,int j,int ti,int tj)
{
int x,y;
x=i+1,y=j+2;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i][j+1]=='\0')
{
if(ti==x&&tj==y) return true;
}
x=i-1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i][j+1]=='\0')
{
if(ti==x&&tj==y) return true;
}
x=i+2,y=j+1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i+1][j]=='\0')
{
if(ti==x&&tj==y) return true;
}
y=j-1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i+1][j]=='\0')
{
if(ti==x&&tj==y) return true;
}
x=i+1,y=j-2;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i][j-1]=='\0')
{
if(ti==x&&tj==y) return true;
}
x=i-1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i][j-1]=='\0')
{
if(ti==x&&tj==y) return true;
}
x=i-2,y=j-1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i-1][j]=='\0')
{
if(ti==x&&tj==y) return true;
}
y=j+1;
if(x>0&&x<=10&&y>0&&y<=9&&i>0&&i<=10&&j>0&&j<=9&&map[i-1][j]=='\0')
{
if(ti==x&&tj==y) return true;
}
return false;
}
bool ChariotEat(int i,int j,int ti,int tj)
{
if(ti!=i && tj!=j) return false;
int k,s,e;
if(ti==i)
{
s=min(j,tj);
e=max(j,tj);
for(k=s+1;k<e;k++)
{
if(map[i][k]!='\0')
return false;
}
}
if(tj==j)
{
s=min(i,ti);
e=max(i,ti);
for(k=s+1;k<e;k++)
{
if(map[k][j]!='\0')
return false;
}
}
return true;
}
bool GeneralEat(int i,int j,int ti,int tj)
{
if(j!=tj) return false;
int k,s,e;
s=min(i,ti);
e=max(i,ti);
for(k=s+1;k<e;k++)
{
if(map[k][j]!='\0')
{
return false;
}
}
return true;
}
bool CannonEat(int i,int j,int ti,int tj)
{
if(ti!=i&&tj!=j) return false;
int k,s,e,cnt;
if(ti==i)
{
cnt=0;
s=min(j,tj);
e=max(j,tj);
for(k=s+1;k<e;k++)
{
if(map[i][k]!='\0')
{
cnt++;
}
}
if(cnt==1) return true;
}
if(tj==j)
{
cnt=0;
s=min(i,ti);
e=max(i,ti);
for(k=s+1;k<e;k++)
{
if(map[k][j]!='\0')
cnt++;
}
if(cnt==1) return true;
}
return false;
}
bool checkmate()
{
int x,y,i,j;
bool flag=false;
for(i=0;i<4;i++)
{
x=bi+dx[i];
y=bj+dy[i];
for(j=1;j<=n;j++)
{
if(p[j].x==x && p[j].y==y)
{
//map[bi][bj]='\0';
p[j].flag=false;
}
}
flag=false;
if(x<1||x>3||y<4||y>6) continue;
//cout<<"x:"<<x<<" y:"<<y<<endl;
//cout<<"bi: "<<bi<<" bj:"<<bj<<" i:"<<i<<endl;
map[bi][bj]='\0';
for(j=1;j<=n;j++)
{
if(!p[j].flag) continue;
if(p[j].name=='G')
{
if(GeneralEat(p[j].x,p[j].y,x,y))
{
//cout<<"Geat"<<" X:"<<p[j].x<<" Y:"<<p[j].y<<endl;
flag=true;
}
}
else if(p[j].name=='R')
{
if(ChariotEat(p[j].x,p[j].y,x,y))
{
//cout<<"Reat"<<" X:"<<p[j].x<<" Y:"<<p[j].y<<endl;
flag=true;
}
}
else if(p[j].name=='H')
{
if(HorseEat(p[j].x,p[j].y,x,y))
{
//cout<<"Heat"<<" X:"<<p[j].x<<" Y:"<<p[j].y<<endl;
flag=true;
}
}
else if(p[j].name=='C')
{
if(CannonEat(p[j].x,p[j].y,x,y))
{
//cout<<"Ceat"<<" X:"<<p[j].x<<" Y:"<<p[j].y<<endl;
flag=true;
}
}
}
if(!flag)
{
//cout<<"!!!!"<<endl;
return false;
}
for(j=1;j<=n;j++)
{
p[j].flag=true;
}
map[bi][bj]='B';
}
return true;
}
int main()
{
while(cin>>n>>bi>>bj && (n+bi+bj))
{
memset(map,'\0',sizeof(map));
map[bi][bj]='B';
for(int i=1;i<=n;i++)
{
cin>>p[i].name>>p[i].x>>p[i].y;
p[i].flag=true;
map[p[i].x][p[i].y]=p[i].name;
}
if(checkmate())
{
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}