uva 1589


题目大意就是:

一个象棋残局,红方有n(2<=n<=7) 个棋子,黑方只有一个将,红方除了帅,还可能有车,马,炮,并且要考虑“蹩马腿”,输入所有棋子的位置,保证局面合法并且红方已经将军,判断红方是否已经将黑方将死,


解题思路:

用一个棋盘保存红方可以打到的地方,看黑方将是否有其余的地方去,在竖直方向只要判断将能去的大方就可以,也就可以将帅和车一起判断,




#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char cb[12][10],ab[12][10];

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<=3;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;

	}

}
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';

}

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;
	}


}
int judge(int i,int j){		//最后判断将的去处
	int ok=1;
	if(i+1<=3 && ab[i+1][j]!='S') ok=0;
	if(i-1>=1 && ab[i-1][j]!='S') ok=0;
	if(j+1<=7 && ab[i][j+1]!='S') ok=0;
	if(j-1>=4 && ab[i][j-1]!='S') ok=0;
	return ok;
}








int main(){
	int n,a1,b1;
	int Ch[8][3];

	while(cin>>n>>a1>>b1&&n&&a1&&b1){

		memset(cb,'A',sizeof(cb));  //起始棋盘
		memset(ab,'A',sizeof(ab));	//目标棋盘
		memset(Ch,0,sizeof(Ch));	//保存输入
		cb[a1][b1]='B';
		char ch;
		for(int k=0;k<n;k++){
			int i,j;
			cin>>ch>>i>>j;
			cb[i][j]=ch;
			Ch[k][0]=i;
			Ch[k][1]=j;

		}
		for(int m=0;m<n;m++){
			int a=Ch[m][0],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);
		}
		puts(judge(a1,b1)?"YES":"NO");


	}


	return 0;
}







转载于:https://www.cnblogs.com/Double-LL/p/6658926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值