这题去年uva做过,做的我差点把电脑砸了。。。
现在虽然比那时强点,但还是花了不少时间。
一看见代码长的就不敢打有木有?我已经尽量少用数组下标了,不然代码一片混乱,长代码恐惧症有木有?
进入正题,马最好处理,条件对角线就好。车和炮都需要判断4个方向,而且攻击范围遇到一个子就停止,相对炮要麻烦点。帅就是车的垂直简化版(我还是有一点象棋基础的哦呵呵~,然而并没有什么卵用)。细节处理了好久,题目上的样例可以了就交,果断WA。后来从别人那里找了点测试数据,原来是炮和马的问题。刚开始我是边输入棋子边处理,可是这样就会发现假如炮可以憋马腿,但炮在马之后输入,这样就无法判断。不得已只好用结构体(噗),先存起来再判断,好在数据量不大。。。
现在看看这200多行的代码,依旧渗人。少壮不努力,老大做模拟啊。。。要不是现在做出来了,我估计又把电脑砸了转存失败重新上传取消
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <ctype.h>
#include <string.h>
using namespace std;
const int N = 20000;
const int INF = 1000000;
char vis[11][10];//表示放过子的地方
char Map0[11][10]; //表示可以走的地方
int flag;
struct node
{
int x0, y0;
char chess[5];
}f[15];
char Map[11][10] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0}};
void R(int x, int y)
{
for(int i = x + 1; i <= 11; i ++)
{
int flag = 1;
Map0[i][y] = 0;
if(vis[i][y])
{
flag = 0;
}
if(flag == 0) break;
}
for(int i = x - 1; i >= 0; i --)
{
int flag = 1;
Map0[i][y] = 0;
if(vis[i][y])
{
flag = 0;
}
if(flag == 0) break;
}
for(int i = y + 1; i <= 10; i ++)
{
int flag = 1;
Map0[x][i] = 0;
if(vis[x][i])
{
flag = 0;
}
if(flag == 0) break;
}
for(int i = y - 1; i >= 0; i --)
{
int flag = 1;
Map0[x][i] = 0;
if(vis[x][i])
{
flag = 0;
}
if(flag == 0) break;
}
}
void H(int x, int y) //没问题
{
if(!vis[x + 1][y])
{
Map0[x + 2][y + 1] = Map0[x + 2][y - 1] = 0;
}
if(!vis[x - 1][y])
{
Map0[x - 2][y + 1] = Map0[x - 2][y - 1] = 0;
}
if(!vis[x][y + 1])
{
Map0[x + 1][y + 2] = Map0[x - 1][y + 2] = 0;
}
if(!vis[x][y - 1])
{
Map0[x + 1][y - 2] = Map0[x - 1][y - 2] = 0;
}
}
void C(int x, int y)//ok
{
for(int i = x + 1; i <= 11; i ++)
{
int flag = 1;
if(vis[i][y])
{
for(int j = i + 1; j <= 11; j ++)
{
Map0[j][y] = 0;
if(vis[j][y])
{
flag = 0;
break;
}
}
}
if(flag == 0) break;
}
for(int i = x - 1; i >= 0; i --)//ok
{
int flag = 1;
if(vis[i][y])
{
for(int j = i - 1; j >= 0; j --)
{
Map0[j][y] = 0;
if(vis[j][y])
{
flag = 0;
break;
}
}
}
if(flag == 0) break;
}
for(int i = y + 1; i <= 10; i ++)
{
int flag = 1;
if(vis[x][i])
{
for(int j = i + 1; j <= 10; j ++)
{
Map0[x][j] = 0;
if(vis[x][j])
{
flag = 0;
break;
}
}
}
if(flag == 0) break;
}
for(int i = y - 1; i >= 0; i --)
{
int flag = 1;
if(vis[x][i])
{
for(int j = i - 1; j >= 0; j --)
{
Map0[x][j] = 0;
if(vis[x][j])
{
flag = 0;
break;
}
}
}
if(flag == 0) break;
}
}
void G(int x, int y)
{
for(int i = x + 1; i <= 11; i ++)
{
int flag = 1;
Map0[i][y] = 0;
if(vis[i][y])
{
flag = 0;
}
if(flag == 0) break;
}
for(int i = x - 1; i >= 0; i --)
{
int flag = 1;
Map0[i][y] = 0;
if(vis[i][y])
{
flag = 0;
}
if(flag == 0) break;
}
}
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int n, x, y;
char ord[10];
while(~scanf("%d%d%d", &n, &x, &y) && n && x && y)
{
memset(Map0, 0, sizeof(Map0));
for(int i = 0; i <= 11; i ++)
{
for(int j = 0; j <= 10; j ++)
{
Map0[i][j] = Map[i][j];
}
}
memset(vis, 0, sizeof(vis));
int k = 0;
for(int i = 0; i < n; i ++)
{
cin >> f[i].chess;
scanf("%d%d", &f[i].x0, &f[i].y0);
vis[f[i].x0][f[i].y0] = 1;
// ord[k ++] = f[i].chess[0];
}
for(int i = 0; i < n; i ++)
{
if(f[i].chess[0] == 'R')
{
R(f[i].x0, f[i].y0);
}
else if(f[i].chess[0] == 'H')
{
H(f[i].x0, f[i].y0);
}
else if(f[i].chess[0] == 'C')
{
C(f[i].x0, f[i].y0);
}
else if(f[i].chess[0] == 'G')
{
G(f[i].x0, f[i].y0);
}
}
/* for(int i = 0; i <= 10; i ++)
{
for(int j = 0; j <= 9; j ++)
{
printf("%d ", Map0[i][j]);
}
printf("\n");
}
printf("\n");*/
if(Map0[x + 1][y] == 0 && Map0[x - 1][y] == 0 && Map0[x][y + 1] == 0 && Map0[x][y - 1] == 0) printf("YES\n");
else printf("NO\n");
// printf("\n");
}
return 0;
}