hdu 4121 Xiangqi 大模拟

题目链接:hdu 4121

        判断所给棋盘黑方是不是被将死了,黑方所有移动判断一下就好

/******************************************************
 * File Name:   h.cpp
 * Author:      kojimai
 * Creater Time:2014年08月17日 星期日 14时16分46秒
******************************************************/
/*
 *给一个象棋的棋局,黑方只剩下一个将,红方剩下帅,马,炮,车中的几个,问能否将黑方将死

 *大模拟,判断出黑方所有有没有可能不被将死的行动即可
 **对红方所有剩余棋子,找出它们会将军的位置
 */
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
bool vis[15][15],che[15][15];
struct node
{
	int x,y;
	char ch;
}p[8];
void jiang(int x,int y)//帅会将的位置
{
	for(int i=x-1;i>=1;i--)//上方一条
	{
		if(!vis[i][y])
		{
			che[i][y]=true;
		}
		else
			break;
	}
	return;
}
void ju(int x,int y)//车能将到的位置
{
	for(int i=x-1;i>=1;i--)//上方
	{
		if(vis[i][y])
			break;
		che[i][y]=true;
	}
	for(int i=x+1;i<=3;i++)//下方
	{
		if(vis[i][y])
			break;
		che[i][y]=true;
	}
	for(int j=y+1;j<=6;j++)//右边
	{
		if(vis[x][j])
			break;
		che[x][j]=true;
	}
	for(int j=y-1;j>=4;j--)//左边
	{
		if(vis[x][j])
			break;
		che[x][j]=true;
	}
	return;
}
void ma(int x,int y)//马能将到的位置
{
	if(x==1)//down
	{
		if(!vis[2][y])
		{
			if(y+1<=6)
			che[3][y+1]=true;
			if(y-1>=4)
			che[3][y-1]=true;
		}
	}
	if(x>=3)//up
	{
		if(!vis[x-1][y])
		{
			if(y+1<=6&&y+1>=4)
				che[x-2][y+1]=true;
			if(y-1<=6&&y-1>=4)
				che[x-2][y-1]=true;
		}
	}
	if(y+1<=9&&!vis[x][y+1])
	{
		if(y+2>=4&&y+2<=6&&x+1<=3)
			che[x+1][y+2]=true;
		if(y+2>=4&&y+2<=6&&x-1>=1)
			che[x-1][y+2]=true;
	}
	if(y>=3&&!vis[x][y-1])
	{
		if(y-2>=4&&y-2<=6&&x+1<=3)
			che[x+1][y-2]=true;
		if(y-2>=4&&y-2<=6&&x-1>=1)
			che[x-1][y-2]=true;
	}
	return;
}
void pao(int x,int y)//炮能将到的位置
{
	if(x>=1&&x<=3)
	{
		bool flag=false;
		for(int i=y+1;i<=6;i++)
		{
			if(vis[x][i])
			{
				if(!flag)
					flag=true;
				else
					break;
			}
			else if(flag)
				che[x][i]=true;
		}
		flag=false;
		for(int i=y-1;i>=4;i--)
		{
			if(vis[x][i])
			{
				if(!flag)
					flag=true;
				else
					break;
			}
			else if(flag)
				che[x][i]=true;
		}
	}
	if(y>=4&&y<=6)
	{
		bool flag = false;
		for(int i=x+1;i<=3;i++)
		{
			if(vis[i][y])
			{
				if(flag)
					break;
				else
					flag=true;
			}
			else if(flag)
				che[i][y]=true;
		}
		flag=false;
		for(int i=x-1;i>=1;i--)
		{
			if(vis[i][y])
			{
				if(flag)
					break;
				else flag=true;
			}
			else if(flag)
				che[i][y]=true;
		}
	}
	return;
}
bool check(int x,int y,int n)//看黑方移动到x,y位置能否不被将死
{
	memset(vis,false,sizeof(vis));
	memset(che,false,sizeof(che));
	for(int i=0;i<n;i++)
	{
		if(p[i].x==x&&p[i].y==y)
			continue;
		vis[p[i].x][p[i].y]=true;
	}
	for(int i=0;i<n;i++)
	{
		if(p[i].x==x&&p[i].y==y)
			continue;
		if(p[i].ch=='G')
		{
			jiang(p[i].x,p[i].y);
		}
		else if(p[i].ch=='R')
		{
			ju(p[i].x,p[i].y);
		}
		else if(p[i].ch=='H')
		{
			ma(p[i].x,p[i].y);
		}
		else
			pao(p[i].x,p[i].y);
	}
	if(!che[x][y])
		return true;
	else return false;
}
int main()
{
	int n,x,y;
	while(cin>>n>>x>>y)
	{
		if(x+y+n==0)break;
		for(int i=0;i<n;i++)
		{
			cin>>p[i].ch>>p[i].x>>p[i].y;
		}
		if(x>1)
		{
			if(check(x-1,y,n))
			{
				printf("NO\n");
				continue;
			}
		}
		if(x<3)
		{
			if(check(x+1,y,n))
			{
				printf("NO\n");
				continue;
			}
		}
		if(y<6)
		{
			if(check(x,y+1,n))
			{
				printf("NO\n");
				continue;
			}
		}
		if(y>4)
		{
			if(check(x,y-1,n))
			{
				printf("NO\n");
				continue;
			}
		}
		printf("YES\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值