UVA 1589 java

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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值