习题4-1
https://vjudge.net/problem/UVA-1589
注意将吃掉红旗的情况
#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
struct node {
string f;
int r, c;
};
node all[10];
int vis[15][15] = {};
int jiang[15][15] = {};
int N, r, c;
int main() {
for (int i = 1; i <= 9; ++i)
vis[0][i] = vis[11][i] = 1;
for (int i = 1; i <= 10; ++i)
vis[i][0] = vis[i][10] = 1;
for (int i = 4; i <= 6; ++i)
jiang[0][i] = jiang[4][i] = 1;
for (int i = 1; i <= 3; ++i)
jiang[i][3] = jiang[i][7] = 1;
#ifdef _DEBUG
freopen("in", "rb", stdin);
#endif // _DEBUG
while (cin >> N >> r >> c && (N || r || c)) {
for (int i = 1; i <= 10; ++i)
for (int j = 1; j <= 9; ++j)
vis[i][j] = 0;
for (int i = 1; i <= 3; ++i)
for (int j = 4; j <= 6; ++j)
jiang[i][j] = 0;
for (int i = 0; i < N; ++i) {
cin >> all[i].f >> all[i].r >> all[i].c;
vis[all[i].r][all[i].c] = 1;
}
int x, y;
bool win = true;
for (int i = 0; i < N; ++i) {
x = all[i].r, y = all[i].c;
switch (all[i].f[0])
{
case 'R':
while ((jiang[++x][y] = 1) && !vis[x][y]);
x = all[i].r;
while ((jiang[--x][y] = 1) && !vis[x][y]);
x = all[i].r;
while ((jiang[x][++y] = 1) && !vis[x][y]);
y = all[i].c;
while ((jiang[x][--y] = 1) && !vis[x][y]);
break;
case 'H':
if (!vis[x + 1][y]) {
if (x + 2 < 11 && y - 1 > 0) jiang[x + 2][y - 1] = 1;
if (x + 2 < 11 && y + 1 < 10) jiang[x + 2][y + 1] = 1;
}
if (!vis[x - 1][y]) {
if (x - 2 > 0 && y - 1 > 0) jiang[x - 2][y - 1] = 1;
if (x - 2 > 0 && y + 1 < 10) jiang[x - 2][y + 1] = 1;
}
if (!vis[x][y + 1]) {
if (y + 2 < 10 && x - 1 > 0) jiang[x - 1][y + 2] = 1;
if (y + 2 < 10 && x + 1 < 11) jiang[x + 1][y + 2] = 1;
}
if (!vis[x][y - 1]) {
if (y - 2 > 0 && x - 1 > 0) jiang[x - 1][y - 2] = 1;
if (y - 2 > 0 && x + 1 < 11) jiang[x + 1][y - 2] = 1;
}
break;
case 'C':
while (!vis[++x][y]);
if (x < 10)
while ((jiang[++x][y] = 1)&&!vis[x][y]) ;
x = all[i].r;
while (!vis[--x][y]);
if (x > 1)
while ((jiang[--x][y] = 1)&&!vis[x][y]) ;
x = all[i].r;
while (!vis[x][++y]);
if (y < 9) while
((jiang[x][++y] = 1)&&!vis[x][y]) ;
y = all[i].c;
while (!vis[x][--y]);
if (y > 1)
while ((jiang[x][--y] = 1)&&!vis[x][y]) ;
break;
case 'G':
while ((jiang[--x][y]=1) && !vis[x][y])
if (x == r && y == c) win = false;
break;
default:
break;
}
}
if (!jiang[r + 1][c]) win = false;
if (!jiang[r - 1][c]) win = false;
if (!jiang[r][c + 1]) win = false;
if (!jiang[r][c - 1]) win = false;
if (win) printf("YES\n");
else printf("NO\n");
}
}