Checking the kings against others may be faster than checking reverse ly. 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:
- /*************************************************************************
- * Copyright (C) 2008 by liukaipeng *
- * liukaipeng at gmail dot com *
- *************************************************************************/
- /* @JUDGE_ID 00000 10196 C "Check The Check" */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <strings.h>
- int check(char board[][12], int bx, int by, int wx, int wy)
- {
- int x, y;
- /* check for knight */
- if (board[by-1][bx-2] == 'N' ||
- board[by-2][bx-1] == 'N' ||
- board[by-2][bx+1] == 'N' ||
- board[by-1][bx+2] == 'N' ||
- board[by+1][bx+2] == 'N' ||
- board[by+2][bx+1] == 'N' ||
- board[by+2][bx-1] == 'N' ||
- board[by+1][bx-2] == 'N')
- return 0;
- if (board[wy-1][wx-2] == 'n' ||
- board[wy-2][wx-1] == 'n' ||
- board[wy-2][wx+1] == 'n' ||
- board[wy-1][wx+2] == 'n' ||
- board[wy+1][wx+2] == 'n' ||
- board[wy+2][wx+1] == 'n' ||
- board[wy+2][wx-1] == 'n' ||
- board[wy+1][wx-2] == 'n')
- return 1;
- /* check for pawn */
- if (board[by+1][bx-1] == 'P' ||
- board[by+1][bx+1] == 'P')
- return 0;
- if (board[wy-1][wx-1] == 'p' ||
- board[wy-1][wx+1] == 'p')
- return 1;
- /* check for others */
- for (x = bx-1; x >= 2; --x)
- if (board[by][x] == 'R' || board[by][x] == 'Q')
- return 0;
- else if (board[by][x] != '.')
- break;
- for (x = bx+1; x < 10; ++x)
- if (board[by][x] == 'R' || board[by][x] == 'Q')
- return 0;
- else if (board[by][x] != '.')
- break;
- for (y = by-1; by >= 2; --y)
- if (board[y][bx] == 'R' || board[y][bx] == 'Q')
- return 0;
- else if (board[y][bx] != '.')
- break;
- for (y = by+1; by < 10; ++y)
- if (board[y][bx] == 'R' || board[y][bx] == 'Q')
- return 0;
- else if (board[y][bx] != '.')
- break;
- for (x = bx-1, y = by-1; x >= 2 && y >= 2; --x, --y)
- if (board[y][x] == 'B' || board[y][x] == 'Q')
- return 0;
- else if (board[y][x] != '.')
- break;
- for (x = bx+1, y = by-1; x < 10 && y >= 2; ++x, --y)
- if (board[y][x] == 'B' || board[y][x] == 'Q')
- return 0;
- else if (board[y][x] != '.')
- break;
- for (x = bx+1, y = by+1; x < 10 && y < 10; ++x, ++y)
- if (board[y][x] == 'B' || board[y][x] == 'Q')
- return 0;
- else if (board[y][x] != '.')
- break;
- for (x = bx-1, y = by+1; x >= 2 && y < 10; --x, ++y)
- if (board[y][x] == 'B' || board[y][x] == 'Q')
- return 0;
- else if (board[y][x] != '.')
- break;
- for (x = wx-1; x >= 2; --x)
- if (board[wy][x] == 'r' || board[wy][x] == 'q')
- return 1;
- else if (board[wy][x] != '.')
- break;
- for (x = wx+1; x < 10; ++x)
- if (board[wy][x] == 'r' || board[wy][x] == 'q')
- return 1;
- else if (board[wy][x] != '.')
- break;
- for (y = wy-1; wy >= 2; --y)
- if (board[y][wx] == 'r' || board[y][wx] == 'q')
- return 1;
- else if (board[y][wx] != '.')
- break;
- for (y = wy+1; wy < 10; ++y)
- if (board[y][wx] == 'r' || board[y][wx] == 'q')
- return 1;
- else if (board[y][wx] != '.')
- break;
- for (x = wx-1, y = wy-1; x >= 2 && y >= 2; --x, --y)
- if (board[y][x] == 'b' || board[y][x] == 'q')
- return 1;
- else if (board[y][x] != '.')
- break;
- for (x = wx+1, y = wy-1; x < 10 && y >= 2; ++x, --y)
- if (board[y][x] == 'b' || board[y][x] == 'q')
- return 1;
- else if (board[y][x] != '.')
- break;
- for (x = wx+1, y = wy+1; x < 10 && y < 10; ++x, ++y)
- if (board[y][x] == 'b' || board[y][x] == 'q')
- return 1;
- else if (board[y][x] != '.')
- break;
- for (x = wx-1, y = wy+1; x >= 2 && y < 10; --x, ++y)
- if (board[y][x] == 'b' || board[y][x] == 'q')
- return 1;
- else if (board[y][x] != '.')
- break;
- return 2;
- }
- int main(int argc, char *argv[])
- {
- #ifndef ONLINE_JUDGE
- char in[256];
- char out[256];
- strcpy(in, argv[0]);
- strcat(in, ".in");
- freopen(in, "r", stdin);
- strcpy(out, argv[0]);
- strcat(out, ".out");
- freopen(out, "w", stdout);
- #endif
- char board[12][12];
- char *message[] = {
- "black king is in check.",
- "white king is in check.",
- "no king is in check.",
- };
- int x, y;
- int c;
- int n;
- int empty;
- int bx, by, wx, wy;
- bzero(board, 12*12);
- for (n = 1, empty = 1; ; ++n, empty = 1) {
- for (y = 2; y < 10; ++y) {
- for (x = 2; x < 10; ++x) {
- c = getchar();
- board[y][x] = c;
- if (c != '.') {
- empty = 0;
- if (c == 'k')
- bx = x, by = y;
- else if (c == 'K')
- wx = x, wy = y;
- }
- }
- getchar();
- }
- if (empty)
- break;
- printf("Game #%d: %s/n", n, message[check(board, bx, by, wx, wy)]);
- c = getchar();
- }
- return 0;
- }