#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct xiang { int x, y; char type; }final[15]; const int four[4][2]={{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; //绊马脚的情况 const int ma[8][2]={{-1, -2}, {1, -2}, {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, -1}, {2, 1}}; //马四个方位的走法 int book[15][15]; int fx, fy, n; bool judge(int x, int y) { for(int a=0;a<n;a++) { if(book[final[a].x][final[a].y]) { if(final[a].type!='H') { if(final[a].y==y) { int nmin=min(final[a].x, x), nmax=max(final[a].x, x), nall=0; for(int b=nmin+1;b<nmax;b++) { if(book[b][y]) nall++; } if(final[a].type=='G' && nall==0)return true; else if(final[a].type=='C' && nall==1 || final[a].type=='R' && nall==0)return true; } else if(final[a].x==x) { int nmin=min(final[a].y, y), nmax=max(final[a].y, y), nall=0; for(int b=nmin+1;b<nmax;b++) { if(book[x][b]) nall++; } if(final[a].type=='C' && nall==1 || final[a].type!='C' && nall==0)return true; } } else { for(int b=0;b<8;b++) { int nx=final[a].x+ma[b][0], ny=final[a].y+ma[b][1]; if(nx==x && ny==y) { if(book[final[a].x+four[b/2][0]][final[a].y+four[b/2][1]])break; return true; } } } } } return false; } bool solve() //首先判断帅王相对的情况。然后判断黑帅的四个走法的合法性。 { int nx, ny; for(int a=0;a<n;a++) { if(final[a].type=='G' && fy==final[a].y) { int flag=0; for(int c=fx+1;c<final[a].x;c++) { if(book[c][fy]) { flag=1; break; } } if(flag) break; return false; } } for(int a=0;a<4;a++) { int flag=0; nx=four[a][0]+fx; ny=four[a][1]+fy; if(ny<4 || ny>6 || nx<1 || nx>3) continue; if(book[nx][ny])flag=1; book[nx][ny]=0; if(!judge(nx, ny)) return false; if(flag)book[nx][ny]=1; } return true; } int main() { while(cin>>n>>fx>>fy && (n || fx|| fy)) { memset(book, 0, sizeof(book)); for(int a=0;a<n;a++) { cin>>final[a].type; cin>>final[a].x>>final[a].y; book[final[a].x][final[a].y]=1; } if(solve()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
象棋 (Xiangqi, ACM/ICPC Fuzhou 2011, UVa1589)
最新推荐文章于 2024-07-28 10:44:26 发布