挺恶心的模拟,卡了好长时间。。
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; }