真好,一不小心忘判断卡马脚,改了就过了!
思路:求封锁的位置(即走到那会被吃,和原来的棋盘分开保存使其互不干扰)
那就模拟呗
将:先杀,杀到有人,那个人杀了,然后停
车:和将一毛一样,只不过多了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;
}