UVA 1589 象棋

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103455#problem/A

题目大意:判断是否将死黑棋

题目分析:模拟题,不难,记录下被将的位置,判断将移动位置是否全被将,但是细节注意较多,wa了很多次。

注意要点:1.将和帅直接对位,红棋直接输,故输出NO。 2.如果某被将位置有棋,也应判断被将,因为将可能把该棋吃掉。3.先全记录下棋子位置,再进行判断。(这里挖了很多次)

AC代码:

#include<stdio.h>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm> 
#include<vector>
#include<map>
using namespace std;
int gx[5]={0,0,0,-1,1},gy[5]={0,1,-1,0,0};
int hx[9]={0,2,2,1,1,-1,-1,-2,-2},hy[9]={0,1,-1,2,-2,2,-2,1,-1}; 
int tx[9]={0,1,1,0,0,0,0,-1,-1},ty[9]={0,0,0,1,-1,1,-1,0,0};
int a[20][20]={0};
bool horse(int x1,int y1,int i)
{
	int x,y;
	x=x1+hx[i]; y=y1+hy[i];
	if (x<1 || x>10 || y<1 || y>9) return 0;
	x=x1+tx[i]; y=y1+ty[i];
	if (a[x][y]==1) return 0;
	return 1;
}
int main()
{
	int n,x,y;
	cin >> n >> x >> y;
	while(n!=0)
	{
		int h[20][20]={0},ax[20],ay[20]; bool tt={1}; char ch[20];
		for (int i=0;i<20;i++)
			for (int j=0;j<20;j++) a[i][j]=0;
		for (int i=1;i<=n;i++){
			cin >> ch[i] >> ax[i] >> ay[i];
			a[ax[i]][ay[i]]=1;
		}
		for (int i=1;i<=n;i++){
			int xx,yy; char c;
			c=ch[i]; xx=ax[i]; yy=ay[i]; 
			if (c=='R'){
				int t={0};
				for (int j=xx+1;j<=3;j++){
					if (t==0) h[j][yy]=1;
					if (a[j][yy]==1) t++;
				}
				t=0;
				for (int j=xx-1;j>=1;j--){
					if (t==0) h[j][yy]=1;
					if (a[j][yy]==1) t++;
				}
				t=0;
				for (int j=yy+1;j<=6;j++){
					if (t==0) h[xx][j]=1;
					if (a[xx][j]==1) t++;
				}
				t=0;
				for (int j=yy-1;j>=4;j--){
					if (t==0) h[xx][j]=1;
					if (a[xx][j]==1) t++;
				}
			}
			if (c=='G'){
				int t={0};
				for (int j=xx-1;j>=1;j--){
					if (t==0) {
						h[j][yy]=1;
						if (x==j && y==yy) tt=0;
					}
					if (a[j][yy]==1) t++;
				}
			}
			if (c=='C'){
				int t={0};
				for (int j=xx+1;j<=3;j++){
					if (t==1) h[j][yy]=1;
					if (a[j][yy]==1) t++;
				}
				t=0;
				for (int j=xx-1;j>=1;j--){
					if (t==1) h[j][yy]=1;
					if (a[j][yy]==1) t++;
				}
				t=0;
				for (int j=yy+1;j<=6;j++){
					if (t==1) h[xx][j]=1;
					if (a[xx][j]==1) t++;
				}
				t=0;
				for (int j=yy-1;j>=4;j--){
					if (t==1) h[xx][j]=1;
					if (a[xx][j]==1) t++;
				}
			}
			if (c=='H'){
				for (int j=1;j<=8;j++){
					if (horse(xx,yy,j)) h[xx+hx[j]][yy+hy[j]]=1;
				}
			}
		}
		int xx,yy;
		for (int i=0;i<=4;i++){
			xx=x+gx[i]; yy=y+gy[i];
			if (xx>=1 && xx<=3 && yy>=4 & yy<=6) 
			if (h[xx][yy]==0) tt=0;
		}
		if (tt) cout << "YES" << endl; else cout << "NO" << endl;
		cin >> n >> x >> y;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值