Poj 4001 Hdu 4121 Xiangqi

这题是道模拟题,题意很简单,现在黑棋只有一个“将”,红棋可能有“帅”,“车”,“炮”,“马”,走棋方式和我们平常下棋一样,现在是黑棋走,问黑棋是否能走到安全的位置上去,解题思路就是判断黑棋能走的四个方向是否安全,对车,炮,马分别判断,代码如下:

#include<stdio.h>
int dir[4][2]={0,1,1,0,0,-1,-1,0};				//四个方向
int dir2[8][2]={1,2,2,1,-1,2,-2,1,2,-1,1,-2,-1,-2,-2,-1};				//马能走的四个方向
int dir3[8][2]={1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1};				//如果对应的地方有棋子,则马无法走
char map[20][20];								//标志棋盘
bool inpal(int x,int y)							//判断将是否在九宫格中
{
	if(x>3 || x<1 || y<4 || y>6)
		return false;
	return true;
}
bool isIn(int x,int y)							//判断棋子是否在棋盘中
{
	if(x<1 || x>10 || y<1 || y>9)
		return false;
	return true;
}
bool isR(int x,int y,int dir[])					//如果向一个方向一直走遇到的第一个棋子是车或者帅,则这个位置不安全
{
	while(1)
	{
		x=x+dir[0];
		y=y+dir[1];
		if(!isIn(x,y))
			break;
		if(map[x][y]=='R' || map[x][y]=='G')
			return false;
		if(map[x][y]!='0')
			return true;
	}
	return true;
}
bool isC(int x,int y,int dir[])					//如果向一个方向一直走遇到的第二个是炮,则这个位置不安全
{
	int c=0;
	while(1)
	{
		x=x+dir[0];
		y=y+dir[1];
		if(!isIn(x,y))
			break;
		if(map[x][y]=='C' && c==1)
			return false;
		if(map[x][y]!='0')
			c++;
	}
	return true;
}
bool isH(int x,int y)							//如果马能走到这个位置而且不别马腿,则这个位置不安全
{
	int i;
	for(i=0;i<8;i++)
		if(isIn(x+dir2[i][0],y+dir2[i][1]) && map[x+dir2[i][0]][y+dir2[i][1]]=='H' && map[x+dir3[i][0]][y+dir3[i][1]]=='0')
			return false;
	return true;
}
bool isOk(int x,int y)							//判断一个位置安不安全
{
	int i;
	for(i=0;i<4;i++)
		if(!isR(x,y,dir[i]) || !isC(x,y,dir[i]))
			return false;
	if(!isH(x,y))
		return false;
	return true;
}
bool all(int x,int y)							//判断将周围四个位置是否有安全的
{
	int i;
	for(i=0;i<4;i++)
		if(inpal(x+dir[i][0],y+dir[i][1]) && isOk(x+dir[i][0],y+dir[i][1]))
			return true;
	return false;
}
int main()
{
	char ch[5];
	int gen[2],i,j,n,x,y;
	while(scanf("%d %d %d",&n,&gen[0],&gen[1]) && gen[0])
	{
		for(i=0;i<20;i++)
			for(j=0;j<20;j++)
				map[i][j]='0';
		for(i=0;i<n;i++)
		{
			scanf("%s %d %d",ch,&x,&y);
			map[x][y]=ch[0];
		}
		if(all(gen[0],gen[1]))
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值