Uva1589 Xiangqi(象棋)
解答:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char map[20][20],a; int vis[20][20],n,px,py,w=0; void mark1(int x,int y) { for(int i=y+1;i<=9;i++) { if(map[x][i]=='0'||map[x][i]=='x') vis[x][i]=1; else { vis[x][i]=1; break; } } for(int i=y-1;i>=1;i--) { if(map[x][i]=='0'||map[x][i]=='x') vis[x][i]=1; else { vis[x][i]=1; break; } } for(int i=x+1;i<=10;i++) { if(map[i][y]=='0'||map[i][y]=='x') vis[i][y]=1; else { vis[i][y]=1; break; } } for(int i=x-1;i>=1;i--) { if(map[i][y]=='0'||map[i][y]=='x') vis[i][y]=1; else { vis[i][y]=1; break; } } } void mark2(int x,int y) { if(map[x][y-1]=='0'&&y-2>0&&x-1>0) vis[x-1][y-2]=1; if(map[x][y+1]=='0'&&y+2<=9&&x-1>0) vis[x-1][y+2]=1; if(map[x][y-1]=='0'&&y-2>0&&x+1<=10) vis[x+1][y-2]=1; if(map[x][y+1]=='0'&&y+2<=9&&x+1<=10) vis[x+1][y+2]=1; if(map[x-1][y]=='0'&&x-2>0&&y-1>0) vis[x-2][y-1]=1; if(map[x-1][y]=='0'&&x-2>0&&y+1<=9) vis[x-2][y+1]=1; if(map[x+1][y]=='0'&&x+2<=10&&y-1>0) vis[x+2][y-1]=1; if(map[x+1][y]=='0'&&x+2<=10&&y+1<=9) vis[x+2][y+1]=1; } void mark3(int x,int y) { bool b=0; for(int i=y+1;i<=9;i++) { if(map[x][i]!='0'&&map[x][i]!='x') { if(b==1) break; else { b=1; continue; } } if(b) vis[x][i]=1; } b=0; for(int i=y-1;i>=1;i--) { if(map[x][i]!='0'&&map[x][i]!='x') { if(b==1) break; else { b=1; continue; } } if(b) vis[x][i]=1; } b=0; for(int i=x+1;i<=10;i++) { if(map[i][y]!='0'&&map[i][y]!='x') { if(b==1) break; else { b=1; continue; } } if(b) vis[i][y]=1; } b=0; for(int i=x-1;i>=1;i--) { if(map[i][y]!='0'&&map[i][y]!='x') { if(b==1) break; else { b=1; continue; } } if(b) vis[i][y]=1; } } void pp() { for(int i=1;i<=10;i++) { for(int j=1;j<=9;j++) { cout<<map[i][j]; } cout<<endl; } cout<<endl; } int main() { // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); while(1) { w++; scanf("%d%d%d",&n,&px,&py); if(!n) return 0; int x,y; for(int i=1;i<=10;i++) { for(int j=1;j<=9;j++) { map[i][j]='0'; vis[i][j]=0; } } map[px][py]='x'; for(int i=1;i<=n;i++) { cin>>a; scanf("%d%d",&x,&y); map[x][y]=a; } for(int i=1;i<=10;i++) { for(int j=1;j<=9;j++) { if(map[i][j]=='0') continue; else { if(map[i][j]=='G'||map[i][j]=='R') { mark1(i,j); } else if(map[i][j]=='H') { mark2(i,j); } else if(map[i][j]=='C') { mark3(i,j); } } } } //if(w==985) pp(); if(vis[px-1][py]==0&&px-1>0) { puts("NO"); continue; } if(vis[px+1][py]==0&&px+1<=3) { puts("NO"); continue; } if(vis[px][py-1]==0&&py-1>=4) { puts("NO"); continue; } if(vis[px][py+1]==0&&py+1<=6) { puts("NO"); continue; } puts("YES"); } }