大体思路就是红方上下左右四个方向各走一步,看看是否会被吃掉。如果都会被吃,就是被将死,输出YES,否则输出YES。
#include<stdio.h>
#include<string.h>
#define max 15
const int horse_x[max]={1,2,-1,-2,1,2,-1,-2}; //用数组模拟马的行走
const int horse_y[max]={2,1,-2,-1,-2,-1,2,1};
const int dx[max] = {1,0,-1,0}; //用数组模拟车和炮的行走
const int dy[max] = {0,1,0,-1};
struct redflag{
char c;
int x, y;
} red[max];
int black_x, black_y, T;
char qi[max][max];
char readchar()
{ while(1){
char c;
c = getchar();
if(c == 'R' || c == 'C' || c == 'G' || c == 'H')
return c;
}
}
int feijiang(int x, int y)
{ int temp, i;
for(i = x + 1,temp = -1; i <= 10; i++)
{ if(qi[i][y] != 0)
temp++;
if(qi[i][y] == 'G' && temp == 0)
return 1;
}
return 0;
}
int panduan_H(int x, int y) //判断马
{ int i;
for(i = 0; i < 8; i++)
if(x + horse_x[i] > 0 && y + horse_y[i] > 0 && qi[x + horse_x[i]][y + horse_y[i]] == 'H') //判断马能否吃掉将以及蹩马腿的情况
{ if(horse_x[i] == 2 && qi[x + 1][y + horse_y[i]] == 0)
return 1;
if(horse_x[i] == -2 && qi[x - 1][y + horse_y[i]] == 0)
return 1;
if(horse_y[i] == -2 && qi[x + horse_x[i]][y - 1] == 0)
return 1;
if(horse_y[i] == 2 && qi[x + horse_x[i]][y + 1] == 0)
return 1;
}
return 0;
}
int panduan(int x, int y) //总判断,其中包含了判断飞将和马的函数
{ if(feijiang(x,y))return 1;
int i, j, temp;
for(i = 0; i < 4; i++){
temp = 0;
for(j = 1; j <= 10; j++)
{ if(qi[x+dx[i]*j][y+dy[i]*j] != 0 && x+dx[i]*j>=1 && x+dx[i]*j<=10 && y+dy[i]*j>=1 && y+dy[i]*j<=9)
temp++;
if(temp == 1 && qi[x+dx[i]*j][y+dy[i]*j] == 'R')
return 1;
if(temp == 2 && qi[x+dx[i]*j][y+dy[i]*j] == 'C')
return 1;
}
}
if(panduan_H(x,y))return 1;
return 0;
}
int main()
{
int i;
while(~scanf("%d%d%d",&T, &black_x, &black_y) && T){
memset(qi,0,sizeof(qi));
for(i = 1; i <= T; i++)
{red[i].c = readchar();
scanf("%d%d",&red[i].x, &red[i].y);
qi[red[i].x][red[i].y] = red[i].c;
}
int temp1 = 0;
for(i = black_x+1; i <= 10; i++) //判断第一步是否飞将
{ if(qi[i][black_y] != 0)
temp1++;
if(qi[i][black_y] == 'G' && temp1 == 1)
break;
}
if(qi[i][black_y] == 'G' && temp1 == 1)
{ qi[i][black_y] = 0;
printf("NO\n");
continue;
}
if(black_x > 1){
if(!panduan(black_x-1,black_y))
{ printf("NO\n");
continue;
}
}
if(black_x < 3){
if(!panduan(black_x+1,black_y)){
printf("NO\n");
continue;
}
}
if(black_y < 6){
if(!panduan(black_x,black_y+1)){
printf("NO\n");
continue;
}
}
if(black_y > 4){
if(!panduan(black_x,black_y-1)){
printf("NO\n");
continue;
}
}
printf("YES\n");
}
return 0;
}