算法竞赛入门经典(第二版)-刘汝佳-第四章 函数与递归 象棋

本文详细解析了一个关于中国象棋的博弈算法实现,重点介绍了如何通过编程来判断红方棋子是否能在一步内吃掉黑方的将,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hust.edu.cn/vjudge/contest/123676#problem/G 密码5201


ps

1.前面是讲规则。

2.第一行输入红棋个数 和黑将位置

3.H 表示马    C 表示炮     R 表示车    G 表示帅

4.


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
char chess[11][10]; //行  列 
int kx[4]={1,-1,-1,1};
int ky[4]={0,1,-1,-1};
int x,y;
int flag=0;
int G(int a,int b)//将 
{
	if(a==x&&y==b) return 0;
	if(b==y)
	{
		int i;
		int mi=min(a,x);
		int mx=max(a,x);
		for(i=mi+1;i<mx;i++)
		{
			if(chess[i][y]!=0) return 0;
		}
		flag++;
		return 1;
	}
	return 0;
}
int R(int a,int b)	//车 
{
	if(a==x&&y==b) return 0;
	if(G(a,b)) return 1;
	if(a==x)
	{
		int mi=min(y,b);
		int mx=max(y,b);
		int i;
		for(i=mi+1;i<mx;i++)
		{
			if(chess[x][i]!=0) return 0;
		}
		flag++;
		return 1;
	}
	return 0;
}		
int H(int a,int b)	//马
{
	if(a==x&&y==b) return 0;
	if( abs(a-x)+abs(b-y)!=3 ) return 0;
	if(abs(a-x)==2)
	{
		int tx=(a+x)/2;
		if(chess[tx][b]!=0) return 0;
		flag++;
		return 1;
	}
	else if(abs(b-y)==2)
	{
		int ty=(b+y)/2;
		if(chess[a][ty]!=0) return 0;
		flag++;
		return 1;
	}
	return 0;
}
int C(int a,int b) //炮 
{
	if(a==x&&y==b) return 0;
	if(a==x)
	{
		int cut=0,i;
		int mi=min(b,y),mx=max(b,y);
		for(i=mi+1;i<mx;i++)
		{
			if(chess[x][i]!=0) cut++;
			if(cut==2) return 0;
		}
		if(cut==1) {flag++;return 1;}
	}
	else if(b==y)
	{
		int cut=0,i;
		int mi=min(a,x),mx=max(a,x);
		for(i=mi+1;i<mx;i++)
		{
			if(chess[i][y]!=0) cut++;
			if(cut==2) return 0;
		}
		if(cut==1) {flag++;return 1;}
		return 0;
	}
	return 0;
}				
					 
int main()
{
	int n;
//freopen("C:\\Users\\5201\\Desktop\\1.txt","r",stdin);
//freopen("C:\\Users\\5201\\Desktop\\yb.txt","w",stdout);
	while(/*scanf("%d%d%d",&n,&x,&y)*/cin>>n>>x>>y)
	{
		if(n==0&&x==0&&y==0) break;
//		getchar();
		memset(chess,0,sizeof(chess));
	 	int a,b,tx,ty;char c;
	 	flag=0;
	 	while(n--)
	 	{
//	 		scanf("%c%d%d",&c,&a,&b);getchar();
			cin>>c>>a>>b;
	 		chess[a][b]=c;
	 		if(c=='G'){tx=a;ty=b;}
	 	}
	 	if(G(tx,ty)){printf("NO\n");continue;}
	 	int i,j,k;
	 	for(k=0;k<4;k++)
	 	{
	 		x+=kx[k];y+=ky[k];
	 		if(x<1||x>3) {flag++;continue;}
	 		if(y<4||y>6) {flag++;continue;}
	 		for(i=1;i<=10;i++)
	 		{
		 		for(j=1;j<=9;j++)
		 		{
		 			char ch=chess[i][j];
		 			if(ch==0) continue;
		 			if(ch=='G')
		 			{
			 			if( G(i,j) ) break;
			 		}			 	 		
		 			else if(ch=='C') 
		 			{
			 			if( C(i,j) ) break;
			 		}			 		
		 			else if(ch=='R')
		 			{
			 			if( R(i,j) ) break;
			 		}	
		 			else if(ch=='H')
		 			{
			 			if( H(i,j) ) break;
			 		}
				 		
		 		}
		 		if(j<=9) break;
		 	}
	 	}
	 	printf(flag==4?"YES\n":"NO\n"); 
	}
	return 0;
} 


ps

1.输入要注意,用注释掉的代码提交就错了,用cin就过了……  原因不明。

2.在棋盘中读入红棋,遍历棋盘,找到相应棋子,判断能不能吃掉黑棋。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值