现在的位置: 首页 > 综合 > 正文

UVa Problem Solution: 10196 – Check The Check

2013年08月18日 ⁄ 综合 ⁄ 共 4976字 ⁄ 字号 评论关闭

Checking the kings against others may be faster than checking reversely. I check the knights first and then pawns. All the others are checked by walking along in the eight directions. You must be very cautious in coding. A minor typo would causes WA again and again.

A small tip: instead of allocating a 8*8 chess board, making it 12*12 and put the board on the center. This may save you lots of boundary checks.

Code:

  1. /*************************************************************************
  2.  * Copyright (C) 2008 by liukaipeng                                      *
  3.  * liukaipeng at gmail dot com                                           *
  4.  *************************************************************************/
  5. /* @JUDGE_ID 00000 10196 C "Check The Check" */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <strings.h>
  10.                
  11. int check(char board[][12], int bx, int by, int wx, int wy)
  12. {
  13.   int x, y;
  14.   /* check for knight */
  15.   if (board[by-1][bx-2] == 'N' ||
  16.       board[by-2][bx-1] == 'N' ||
  17.       board[by-2][bx+1] == 'N' ||
  18.       board[by-1][bx+2] == 'N' ||
  19.       board[by+1][bx+2] == 'N' ||
  20.       board[by+2][bx+1] == 'N' ||
  21.       board[by+2][bx-1] == 'N' ||
  22.       board[by+1][bx-2] == 'N')
  23.     return 0;
  24.   if (board[wy-1][wx-2] == 'n' ||
  25.       board[wy-2][wx-1] == 'n' ||
  26.       board[wy-2][wx+1] == 'n' ||
  27.       board[wy-1][wx+2] == 'n' ||
  28.       board[wy+1][wx+2] == 'n' ||
  29.       board[wy+2][wx+1] == 'n' ||
  30.       board[wy+2][wx-1] == 'n' ||
  31.       board[wy+1][wx-2] == 'n')
  32.     return 1;
  33.   
  34.   /* check for pawn */
  35.   if (board[by+1][bx-1] == 'P' || 
  36.       board[by+1][bx+1] == 'P')
  37.       return 0;
  38.   if (board[wy-1][wx-1] == 'p' ||
  39.       board[wy-1][wx+1] == 'p')
  40.       return 1;
  41.   /* check for others */
  42.   for (x = bx-1; x >= 2; --x)
  43.     if (board[by][x] == 'R' || board[by][x] == 'Q')
  44.       return 0;
  45.     else if (board[by][x] != '.')
  46.       break;
  47.   for (x = bx+1; x < 10; ++x)
  48.     if (board[by][x] == 'R' || board[by][x] == 'Q')
  49.       return 0;
  50.     else if (board[by][x] != '.')
  51.       break;
  52.   for (y = by-1; by >= 2; --y)
  53.     if (board[y][bx] == 'R' || board[y][bx] == 'Q')
  54.       return 0;
  55.     else if (board[y][bx] != '.')
  56.       break;
  57.   for (y = by+1; by < 10; ++y)
  58.     if (board[y][bx] == 'R' || board[y][bx] == 'Q')
  59.       return 0;
  60.     else if (board[y][bx] != '.')
  61.       break;
  62.   for (x = bx-1, y = by-1; x >= 2 && y >= 2; --x, --y)
  63.     if (board[y][x] == 'B' || board[y][x] == 'Q')
  64.       return 0;
  65.     else if (board[y][x] != '.')
  66.       break;
  67.   for (x = bx+1, y = by-1; x < 10 && y >= 2; ++x, --y)
  68.     if (board[y][x] == 'B' || board[y][x] == 'Q')
  69.       return 0;
  70.     else if (board[y][x] != '.')
  71.       break;
  72.   for (x = bx+1, y = by+1; x < 10 && y < 10; ++x, ++y)
  73.     if (board[y][x] == 'B' || board[y][x] == 'Q')
  74.       return 0;
  75.     else if (board[y][x] != '.')
  76.       break;
  77.   for (x = bx-1, y = by+1; x >= 2 && y < 10; --x, ++y)
  78.     if (board[y][x] == 'B' || board[y][x] == 'Q')
  79.       return 0;
  80.     else if (board[y][x] != '.')
  81.       break;
  82.   for (x = wx-1; x >= 2; --x)
  83.     if (board[wy][x] == 'r' || board[wy][x] == 'q')
  84.       return 1;
  85.     else if (board[wy][x] != '.')
  86.       break;
  87.   for (x = wx+1; x < 10; ++x)
  88.     if (board[wy][x] == 'r' || board[wy][x] == 'q')
  89.       return 1;
  90.     else if (board[wy][x] != '.')
  91.       break;
  92.   for (y = wy-1; wy >= 2; --y)
  93.     if (board[y][wx] == 'r' || board[y][wx] == 'q')
  94.       return 1;
  95.     else if (board[y][wx] != '.')
  96.       break;
  97.   for (y = wy+1; wy < 10; ++y)
  98.     if (board[y][wx] == 'r' || board[y][wx] == 'q')
  99.       return 1;
  100.     else if (board[y][wx] != '.')
  101.       break;
  102.   for (x = wx-1, y = wy-1; x >= 2 && y >= 2; --x, --y)
  103.     if (board[y][x] == 'b' || board[y][x] == 'q')
  104.       return 1;
  105.     else if (board[y][x] != '.')
  106.       break;
  107.   for (x = wx+1, y = wy-1; x < 10 && y >= 2; ++x, --y)
  108.     if (board[y][x] == 'b' || board[y][x] == 'q')
  109.       return 1;
  110.     else if (board[y][x] != '.')
  111.       break;
  112.   for (x = wx+1, y = wy+1; x < 10 && y < 10; ++x, ++y)
  113.     if (board[y][x] == 'b' || board[y][x] == 'q')
  114.       return 1;
  115.     else if (board[y][x] != '.')
  116.       break;
  117.   for (x = wx-1, y = wy+1; x >= 2 && y < 10; --x, ++y)
  118.     if (board[y][x] == 'b' || board[y][x] == 'q')
  119.       return 1;
  120.     else if (board[y][x] != '.')
  121.       break;
  122.   return 2;
  123. }
  124.  
  125. int main(int argc, char *argv[])
  126. {
  127. #ifndef ONLINE_JUDGE
  128.   char in[256];
  129.   char out[256];
  130.   strcpy(in, argv[0]);
  131.   strcat(in, ".in");
  132.   freopen(in, "r", stdin);
  133.   strcpy(out, argv[0]);
  134.   strcat(out, ".out");
  135.   freopen(out, "w", stdout);
  136. #endif
  137.   char board[12][12];
  138.   char *message[] = {
  139.     "black king is in check.",
  140.     "white king is in check.",
  141.     "no king is in check.",
  142.   };
  143.   int x, y;
  144.   int c;
  145.   int n;
  146.   int empty;
  147.   int bx, by, wx, wy;
  148.   bzero(board, 12*12);
  149.   for (n = 1, empty = 1; ; ++n, empty = 1) {
  150.     for (y = 2; y < 10; ++y) {
  151.       for (x = 2; x < 10; ++x) {
  152.         c = getchar();
  153.         board[y][x] = c;
  154.         if (c != '.') {
  155.           empty = 0;
  156.           if (c == 'k')
  157.             bx = x, by = y;
  158.           else if (c == 'K')
  159.             wx = x, wy = y;
  160.         }
  161.       }
  162.       getchar();
  163.     }
  164.     if (empty)
  165.       break;
  166.     printf("Game #%d: %s/n", n, message[check(board, bx, by, wx, wy)]);
  167.     c = getchar();
  168.   }
  169.   return 0;
  170. }

抱歉!评论已关闭.