|
@@ -1,9 +1,12 @@
|
|
|
+#include <iostream>
|
|
|
#include <cstdio>
|
|
|
#include <cstring>
|
|
|
|
|
|
#define X 10
|
|
|
#define Y 9
|
|
|
|
|
|
+using std::cin;
|
|
|
+
|
|
|
int dx[4] = {1, 0, -1, 0};
|
|
|
int dy[4] = {0, 1, 0, -1};
|
|
|
|
|
@@ -17,7 +20,9 @@ bool is_out(int x, int y) {
|
|
|
}
|
|
|
|
|
|
bool solve(int x, int y) {
|
|
|
+ // Out of black palace
|
|
|
if (x < 1 || 3 < x || y < 4 || 6 < y) return true;
|
|
|
+ // Check cannon and chariot
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
int nx = x + dx[i];
|
|
|
int ny = y + dy[i];
|
|
@@ -44,29 +49,44 @@ bool solve(int x, int y) {
|
|
|
int ny = y + hy[i];
|
|
|
if (is_out(nx, ny)) continue;
|
|
|
if (board[nx][ny] == 'H') {
|
|
|
- nx = x + dx[i / 2];
|
|
|
- ny = y + dy[i / 2];
|
|
|
+ nx -= hx[i] / 2; // Red to black, not black to red!
|
|
|
+ ny -= hy[i] / 2;
|
|
|
if (board[nx][ny] == 0) return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+void print_board() {
|
|
|
+ printf(" 123456789\n");
|
|
|
+ for (int x = 1; x <= X; x++) {
|
|
|
+ printf("%2d", x);
|
|
|
+ for (int y = 1; y <= Y; y++) {
|
|
|
+ if (board[x][y] == 0) {
|
|
|
+ printf(".");
|
|
|
+ } else {
|
|
|
+ printf("%c", board[x][y]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int main() {
|
|
|
int N, gx, gy;
|
|
|
for (;;) {
|
|
|
- scanf("%d %d %d", &N, &gx, &gy);
|
|
|
+ cin >> N >> gx >> gy;
|
|
|
if (N == 0 && gx == 0 && gy == 0) break;
|
|
|
memset(board, 0, sizeof(board));
|
|
|
- char s[2];
|
|
|
+ char ch;
|
|
|
int x, y;
|
|
|
for (int n = 0; n < N; n++) {
|
|
|
- scanf("%s %d %d", &s, &x, &y);
|
|
|
- board[x][y] = s[0];
|
|
|
+ cin >> ch >> x >> y;
|
|
|
+ board[x][y] = ch;
|
|
|
}
|
|
|
bool checkmate = true;
|
|
|
for (int nx = gx + 1, ny = gy; !is_out(nx, ny); nx++) {
|
|
|
- char c = board[nx][ny];
|
|
|
+ char c = board[nx][ny]; // For "flying general"
|
|
|
if (c == 0) continue;
|
|
|
if (c == 'G') checkmate = false;
|
|
|
break;
|