dengxinyi 5 rokov pred
rodič
commit
fad99dfa11
1 zmenil súbory, kde vykonal 27 pridanie a 7 odobranie
  1. 27 7
      poj/4001.xiangqi/main.cc

+ 27 - 7
poj/4001.xiangqi/main.cc

@@ -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;