import java.util.*;
class Main2 {
static char[][] cb=new char[12][10];//放置所有棋子的棋盘
static char[][] ab=new char[12][10];//标记红方可到达的位置
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n,i,j,a1,b1;
int[][] Ch=new int[8][3];
while(true) {
n=sc.nextInt();//红方棋子个数
a1=sc.nextInt();//黑将横坐标
b1=sc.nextInt();//黑将纵坐标
if(n*n+a1*a1+b1*b1==0)break;
for (int k = 0; k < cb.length; k++) {
for (int l = 0; l < cb[0].length; l++) {
Arrays.fill(cb[k], 'A');//初始化
Arrays.fill(ab[k], 'A');//初始化
}
}
cb[a1][b1]='B';//标记黑将
char ch;
for (int k = 0; k < n; k++) {
ch=sc.next().toCharArray()[0];
i=sc.nextInt();
j=sc.nextInt();
cb[i][j]=ch;//摆放旗子到棋盘
Ch[k][0]=i;//该棋子横坐标
Ch[k][1]=j;//该棋子纵坐标
}
for (int m = 0; m < n; m++) {
int a=Ch[m][0];//读取棋子横坐标
int b=Ch[m][1];//读取棋子纵坐标
//红方棋子为 :車 或 帅,进行标记
if(cb[a][b]=='R' || cb[a][b]=='G' ) RG(a,b);
//红方棋子为 :马,进行标记
else if(cb[a][b]=='H') H(a,b);
//红方棋子为 :炮,进行标记
else if(cb[a][b]=='C') C(a,b);
}
if(judge(a1,b1)) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
//炮
private static void C(int a, int b) {
if(b>=4 && b<=6 && a==1)//处在黑方,九宫格的第一行
if(cb[2][b]!='A'&&cb[2][b]!='B') ab[3][b]='S';//如果下方有红棋,则跑到第三行
int c,d;
for(c=a-1;c>=1;c--){
if(cb[c][b]=='B') return;
if(cb[c][b]!='A') break;//找到炮上方的炮架
}
for(d=c-1;d>=1;d--){
ab[d][b]='S';//炮架上方的位置都是可以到达的位置
if(cb[d][b]!='A'&&cb[d][b]!='B') break;//直到遇到红方棋子
}
for(c=b+1;c<=9;c++){
if(cb[a][c]=='B') return;
if(cb[a][c]!='A') break;//找到炮右方的炮架
}
for(d=c+1;d<=9;d++){
ab[a][d]='S';//炮架上方的位置都是可以到达的位置
if(cb[a][d]!='A'&&cb[a][d]!='B') break;//直到遇到红方棋子
}
for(c=b-1;c>=1;c--){
if(cb[a][c]=='B') return;
if(cb[a][c]!='A') break;//找到炮左方的炮架
}
for(d=c-1;d>=1;d--){
ab[a][d]='S';//炮架上方的位置都是可以到达的位置
if(cb[a][d]!='A'&&cb[a][d]!='B') break;//直到遇到红方棋子
}
}
//马:八个方位,如果可到达,且未越界,则标记
private static void H(int a, int b) {
if(cb[a][b+1]=='A' && b+2<=9&&a-1>=1) ab[a-1][b+2]='S';
if(cb[a][b+1]=='A' && b+2<=9&&a+1<11) ab[a+1][b+2]='S';
if(cb[a][b-1]=='A' && b-2>=1&&a-1>=1) ab[a-1][b-2]='S';
if(cb[a][b-1]=='A' && b-2>=1&&a+1<11) ab[a+1][b-2]='S';
if(cb[a+1][b]=='A' && b-1>=1&&a+2<11) ab[a+2][b-1]='S';
if(cb[a+1][b]=='A' && b+1<=9&&a+2<11) ab[a+2][b+1]='S';
if(cb[a-1][b]=='A' && b-1>=1&&a-2>=1) ab[a-2][b-1]='S';
if(cb[a-1][b]=='A' && b+1<=9&&a-2>=1) ab[a-2][b+1]='S';
}
//帅看作和車一样的功能:棋子所在的那一行那一列都可以到达,直到遇到红方棋子
private static void RG(int a, int b) {
int c;
for (c = a-1; c >= 1; c--) {//棋子上边
ab[c][b]='S';
if(cb[c][b]!='A' && cb[c][b]!='B')break;
}
for (c = a+1; c <= 10; c++) {//棋子下边
ab[c][b]='S';
if(cb[c][b]!='A' && cb[c][b]!='B')break;
}
for (c = b+1; c <= 9; c++) {//棋子右边
ab[a][c]='S';
if(cb[a][c]!='A' && cb[a][c]!='B')break;
}
for (c = b-1; c >= 1; c--) {//棋子左边
ab[a][c]='S';
if(cb[a][c]!='A' && cb[a][c]!='B')break;
}
}
private static boolean judge(int i, int j) {
boolean flag=true;//将军
if(i+1<4 && ab[i+1][j]!='S') flag=false;//黑将在九宫格的前两行,他的下方位置他可以走,则没有将军
if(i-1>0 && ab[i-1][j]!='S') flag=false;//黑将在九宫格的后两行,他的上方位置他可以走,则没有将军
if(j+1<7 && ab[i][j+1]!='S') flag=false;//黑将在九宫格的前两列,他的右方位置他可以走,则没有将军
if(j-1>3 && ab[i][j-1]!='S') flag=false;//黑将在九宫格的后两列,他的左方位置他可以走,则没有将军
return flag;
}
}
UVA 1589 java
最新推荐文章于 2024-07-21 22:27:18 发布