习题4_1uva1589象棋

真好,一不小心忘判断卡马脚,改了就过了!
思路:求封锁的位置(即走到那会被吃,和原来的棋盘分开保存使其互不干扰)
那就模拟呗
将:先杀,杀到有人,那个人杀了,然后停
车:和将一毛一样,只不过多了3方向…
炮:先找到自己的另一半,后面就可以开始杀人了,杀到小二(第二个遇到的点)来了,因为小二把自己emmm,所以小二也杀了,然后退隐江湖(4方向)
马:当我者,独有马脚,所以特判马脚不就好了,就4个嘛…因为我走的路有点古怪,在特判会不会一不小心出去嘛
全剧终,上代码:

#include <bits/stdc++.h>
using namespace std;
int qi[25][25],sha[25][24];
int jia[4]={-1,1,0,0};
void jian(int x,int y);
void che(int x,int y);
void ma(int x,int y);
void pao(int x, int y);
int ke(int x,int y);
//sha标记所有对方将不可走的路 
int main()
{
	int n,x,y,x0[35],y0[35];
	char c[35];
	while(scanf("%d%d%d",&n,&x,&y)==3 &&n)
	{
		memset(qi,0,sizeof(qi));
			memset(sha,0,sizeof(sha));
				memset(x0,0,sizeof(x0));
					memset(y0,0,sizeof(y0));
						memset(c,'\0',sizeof(c));
		for (int i = 0; i < n ; i++)
		{
			scanf(" %c%d%d",&c[i],&x0[i],&y0[i]);
			   qi[x0[i]][y0[i]] = 1;//本来棋的摆法 
		}//initialize
		for (int i = 0; i < n; i++)
		{
			if(c[i]=='G')      jian(x0[i],y0[i]); //将 
			else if(c[i]=='R') che(x0[i],y0[i]);//车
			else if(c[i]=='H') ma(x0[i],y0[i]);//马
			else               pao(x0[i],y0[i]);//炮 
		}//operate 
		int ok = 0;
		for (int i = 0; i < 4;i++)
		{
			int	dx =jia[i],dy = jia[3-i];
			if(x+dx >=1 && x+dx <= 3 && y+dy <=6 && y+dy >= 4)
			{
				if(!sha[x+dx][y+dy]) {
					ok = 1; break;//no killed 
				}
			} 
		} 
		if(ok) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
} 
void jian(int x,int y)
{
	for (int j = x-1; j>=1; j--)
	{
		sha[j][y] = 1;
		if(qi[j][y]) break;
	}
}//先走遇子就不干 
void che(int x,int y)
{
	for (int i = x+1;i <= 10; i++)
	{
		sha[i][y] = 1;
		if(qi[i][y]) break;
	}
	for (int i = x-1;i>=1;i--)
	{
		sha[i][y] = 1;
		if(qi[i][y]) break;
	}
	for (int j = y+1; j <= 9;j++)
	{
		sha[x][j] = 1;
		if(qi[x][j]) break;
	}
	for (int j = y-1; j>=1;j--)
	{
		sha[x][j] = 1;
		if(qi[x][j]) break;
	}
}//和将同理就是多了三个方向 
void ma(int x,int y)//就是4个马脚呗莫得马脚则莫得问题 
{
	    for (int i = 0; i < 4;i++)
		{
			int	dx =jia[i],dy = jia[3-i];
			if(ke(x+dx,y+dy) && !qi[x+dx][y+dy])
			{
				if(i == 0)
				{
					if(ke(x-2,y-1)) sha[x-2][y-1] = 1;
					if(ke(x-2,y+1)) sha[x-2][y+1] = 1;
				}
				else if(i==1)
				{
					if(ke(x+2,y-1)) sha[x+2][y-1] = 1;
					if(ke(x+2,y+1)) sha[x+2][y+1] = 1;
				}
				else if(i==2)
				{
					if(ke(x-1,y+2)) sha[x-1][y+2] = 1;
					if(ke(x+1,y+2)) sha[x+1][y+2] = 1;
				}
				else{
					if(ke(x-1,y-2)) sha[x-1][y-2] = 1;
					if(ke(x+1,y-2)) sha[x+1][y-2] = 1;
				}
			}
		} 
}
void pao(int x, int y)//遇第一个子后面就可以标记遇第二子就不干 
{
	int ok = 0;
	for (int i = x+1;i <= 10; i++)
	{
	    if(ok == 1)	sha[i][y] = 1;
		if(qi[i][y]) ok++;
	}
	ok = 0;
	for (int i = x-1;i>=1;i--)
	{
		if(ok == 1)	sha[i][y] = 1;
		if(qi[i][y]) ok++;
	}
	ok = 0;
	for (int j = y+1; j <= 9;j++)
	{
		if(ok == 1) sha[x][j] = 1;
		if(qi[x][j]) ok++;
	}
	ok = 0;
	for (int j = y-1; j>=1;j--)
	{
	 if(ok == 1)	sha[x][j] = 1;
		if(qi[x][j]) ok++;
	}
}
int ke(int x,int y)//判断子是否在棋盘内 
{
	if(x >= 1 && x <=10 && y >= 1 && y <= 9)
	  return 1;
	  return 0;
}
发布了55 篇原创文章 · 获赞 1 · 访问量 2672

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/99465396