又是一道大型模拟题。题意为给你一个残局,一边只剩一个将,问任意挪动这个将之后是否都会被将死,完全符合中国象棋的规则。
好了第一步拆分问题。等等,题你真的看清了吗?
有没有想到将只能在中上方9个位置移动?有没有发现象棋棋盘是9*10而不是10*10?有没有考虑照将?有没有考虑蹩马腿。反正我不是没考虑就是考虑错了。
仔细的理解题意,下面的模拟就是简单了,马,车,炮,将,分别作为四个子问题进行考虑,也就是NOIP普及组的模拟题水平了。
下附AC代码。
#include<iostream>
#include<stdio.h>
#include<string.h>
#define maxn 15
using namespace std;
int n,px,py;
char gra[maxn][maxn];
int flag=false;
int fx[maxn]={0,0,0,1,-1};
int fy[maxn]={0,1,-1,0,0};
int mx[maxn]={0,1,1,2,2,-1,-1,-2,-2};
int my[maxn]={0,2,-2,1,-1,2,-2,1,-1};
int bx[maxn]={0,1,1,1,1,-1,-1,-1,-1};
int by[maxn]={0,1,-1,1,-1,1,-1,1,-1};
bool checkche(int nx,int ny)
{
for(int i=nx+1;i<=10;i++)
{
if(gra[i][ny]!=0)
{
if(gra[i][ny]=='G' || gra[i][ny]=='R')
return true;
else
break;
}
}
for(int i=nx-1;i>=1;i--)
{
if(gra[i][ny]!=0)
{
if(gra[i][ny]=='R')
return true;
else
break;
}
}
for(int i=ny-1;i>=1;i--)
{
if(gra[nx][i]!=0)
{
if(gra[nx][i]=='R')
return true;
else
break;
}
}
for(int i=ny+1;i<=9;i++)
{
if(gra[nx][i]!=0)
{
if(gra[nx][i]=='R')
return true;
else
break;
}
}
return false;
}
bool checkpao(int nx,int ny)
{
int blo=0;
for(int i=ny+1;i<=9;i++)
{
if(blo==1 && gra[nx][i]=='C')
return true;
if(blo>=2)
break;
if(gra[nx][i]!=0)
blo++;
}
blo=0;
for(int i=ny-1;i>=1;i--)
{
if(blo==1 && gra[nx][i]=='C')
return true;
if(blo>=2)
break;
if(gra[nx][i]!=0)
blo++;
}
blo=0;
for(int i=nx+1;i<=10;i++)
{
if(blo==1 && gra[i][ny]=='C')
return true;
if(blo>=2) break;
if(gra[i][ny]!=0)
blo++;
}
blo=0;
for(int i=nx-1;i>=1;i--)
{
if(blo==1 && gra[i][ny]=='C')
return true;
if(blo>=2) break;
if(gra[i][ny]!=0)
blo++;
}
for(int i=1;i<=8;i++)
{
int xx=nx+mx[i];
int yy=ny+my[i];
int bxx=nx+bx[i];
int byy=ny+by[i];
if(1<=xx && xx<=10 && 1<=yy && yy<=9 && gra[xx][yy]=='H' && gra[bxx][byy]==0)
return true;
}
return false;
}
bool dfs(int nx,int ny)
{
if(checkche(nx,ny))
return true;
if(checkpao(nx,ny))
return true;
return false;
}
int main()
{
while(cin>>n>>px>>py && (n || px || py))
{
memset(gra,0,sizeof(gra));
for(int i=1;i<=n;i++)
{
char a;
int x,y;
cin>>a>>x>>y;
gra[x][y]=a;
}
flag=false;
for(int i=1;i<=4;i++)
{
int nx=px+fx[i];
int ny=py+fy[i];
if(1<=nx && nx<=3 && 4<=ny && ny<=6)
{
if(dfs(nx,ny)==false)
{
cout<<"NO";
flag=true;
break;
}
}
}
if(flag==false)
cout<<"YES";
cout<<endl;
}
}