看清楚题目,帅只能走四个方向,枚举四个方向,然后先判马,再判四个方向的直线(其中若直线最近的是马或炮,判后面那个是否是炮)
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define pii pair<int ,int>
#define mp make_pair
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 22
//G R H C
char g[13][13];
int d[4][2] = {0,1,0,-1,-1,0,1,0};
int dd[8][2] = {1,-2,-1,-2,-2,-1,-2,1,-1,2,1,2,2,1,2,-1};
vector<char> v;
bool ma(int x,int y) {
int i,j;
if((g[x-1][y-2] == 'H' && x-1 >= 1) || (g[x-2][y-1] == 'H' && x - 2 >= 1))
{
if(g[x-1][y-1] == '\0')
return false;
}
if(g[x+1][y-2] == 'H' || g[x+2][y-1] == 'H')
{
if(g[x+1][y-1] == '\0')
return false;
}
if((g[x-2][y+1] == 'H' && x-2 >= 1)|| (g[x-1][y+2] == 'H' && x-1 >= 1) )
{
if(g[x-1][y+1] == '\0')
return false;
}
if(g[x+2][y+1] == 'H' || g[x+1][y+2] == 'H')
{
if(g[x+1][y+1] == '\0')
return false;
}
return true;//ok
}
bool chk(int x,int y) {
int i,j;
int sz = 0;
v.clear();
for (j = y-1; j >= 1; j--) {
if (g[x][j] != '\0') {
v.push_back(g[x][j]);
}
}
sz = v.size();
if (sz) {
if (v[0] == 'H' || v[0] == 'C') {
if (sz > 1 && v[1] == 'C') {
return false;
}
} else if (v[0] == 'G') return false;
else if (v[0] == 'R') return false;
}
v.clear();
for (i = x-1; i >= 1; i--) {
if (g[i][y] != '\0') {
v.push_back(g[i][y]);
}
}
sz = v.size();
if (sz) {
if (v[0] == 'H' || v[0] == 'C') {
if (sz > 1 && v[1] == 'C') {
return false;
}
} else if (v[0] == 'G') return false;
else if (v[0] == 'R') return false;
}
v.clear();
for (j = y+1; j <= 9; j++) {
if (g[x][j] != '\0') {
v.push_back(g[x][j]);
}
}
sz = v.size();
if (sz) {
if (v[0] == 'H' || v[0] == 'C') {
if (sz > 1 && v[1] == 'C') {
return false;
}
} else if (v[0] == 'G') return false;
else if (v[0] == 'R') return false;
}
/
v.clear();
for (i = x+1; i <= 10; i++) {
if (g[i][y] != '\0') {
v.push_back(g[i][y]);
}
}
sz = v.size();
if (sz) {
if (v[0] == 'H' || v[0] == 'C') {
if (sz > 1 && v[1] == 'C') {
return false;
}
} else if (v[0] == 'G') return false;
else if (v[0] == 'R') return false;
}
///
return true;
}
int main(){
int n,x,y;
while (cin>>n>>x>>y && n,x,y) {
int i,j;
memset(g,'\0',sizeof(g));
while (n--) {
char c;
int xx,yy;
cin>>c>>xx>>yy;
g[xx][yy] = c;
}
bool ok = 0;
for (i = 0; i < 4; i++) {
int xx = x, yy = y;
xx += d[i][0];
yy += d[i][1];
if (xx >= 1 && xx <= 3 && yy >= 4 && yy <= 6) {
if (ma(xx,yy) && chk(xx,yy)) {
ok = 1;//可走
break;
}
}
}
if (ok) {
printf("NO\n");//不将死
} else {
printf("YES\n");
}
}
return 0;
}