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