uva 1589


题目大意就是:

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


解题思路:

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




#include
#include
#include
#include
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>ch>>i>>j;
			cb[i][j]=ch;
			Ch[k][0]=i;
			Ch[k][1]=j;

		}
		for(int m=0;m





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

你可能感兴趣的:(uva 1589)