チェスは4_1uva1589演習します

ニース、誤ってそれを上に変更し、裁判官カーマ足を忘れてしまいました!
アイデアは:封鎖位置を探す(であること、食べることになることに来て、そしてオリジナルのチェッカーボードが別々のように干渉がないように保持)
その後、シミュレート聖歌
へ:キル、当面の懸念誰かが、その人は殺され、その後、停止した
車を:と髪は、しかし、以上の3方向...うとして
大砲:最初に彼らの残りの半分を見つけ、後者は殺すために始めることができ、即時の懸念小さな2(第2出会いポイント)が小さいため2自身emmmの来ました2が殺され、その後、影(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