/* coder: ACboy date: 2010-2-20 result: AC description: 这题的关键是实现CheckTheNext函数。 */ #include <iostream> #include <string> #include <sstream> using namespace std; // 用来标记某个位置是否有棋子(1有0没有) int flagData[9][9]; // 用来记录某位置是否可以被黑棋或白棋吃到 // (0表示都吃不到,1表示黑棋吃得到,2表示白棋吃得到,3表示黑棋和白棋都吃得到) int data[9][9]; // 用来存储棋盘 char image[9][9]; // 一下的四个数据用来记录黑棋和白棋的k和K的位置。 int blackKingX; int blackKingY; int whiteKingX; int whiteKingY; // 黑棋卒的走法 int p_dx[] = {1, 1}; int p_dy[] = {1, -1}; // 白棋卒的走法 int P_dx[] = {-1, -1}; int P_dy[] = {1, -1}; // 车的走法(黑白一样) int R_r_dx[] = {0, 0, 1, -1}; int R_r_dy[] = {1, -1, 0, 0}; // 象的走法(黑白一样) int B_b_dx[] = {1, -1, 1, -1}; int B_b_dy[] = {1, -1, -1, 1}; // 皇后的走法(黑白一样) int Q_q_dx[] = {1, -1, 1, -1, 0, 0, 1, -1}; int Q_q_dy[] = {1, -1, -1, 1, 1, -1, 0, 0}; // 国王的走法(黑白一样) int K_k_dx[] = {1, -1, 1, -1, 0, 0, 1, -1}; int K_k_dy[] = {1, -1, -1, 1, 1, -1, 0, 0}; // 马的走法(黑白一样) int N_n_dx[] = {-1, -2, -2, -1, 1, 2, 2, 1}; int N_n_dy[] = {-2, -1, 1, 2, 2, 1, -1, -2}; // 返回0表示位置非法,返回1表示位置合法且该位置没有棋子 // 返回2表示位置合法且该位置有棋子 int checkTheNext(int x, int y) { if (x >= 0 && x < 8 && y >= 0 && y < 8) { if (flagData[x][y] == 1) return 2; else return 1; } else return 0; } void p(int x, int y) { for (int i = 0; i < 2; i++) { int newx = x + p_dx[i]; int newy = y + p_dy[i]; if (checkTheNext(newx, newy)) { if (data[newx][newy] == 0 || data[newx][newy] == 1) data[newx][newy] = 1; else data[newx][newy] = 3; } } } int P(int x, int y) { for (int i = 0; i < 2; i++) { int newx = x + P_dx[i]; int newy = y + P_dy[i]; if (checkTheNext(newx, newy)) { if (data[newx][newy] == 0 || data[newx][newy] == 2) data[newx][newy] = 2; else data[newx][newy] = 3; } } } void R_r(int x, int y, int type) { for (int i = 0; i < 4; i++) { int temp; int newx = x + R_r_dx[i]; int newy = y + R_r_dy[i]; temp = checkTheNext(newx, newy); while (temp) { if (data[newx][newy] == 0 || data[newx][newy] == type) data[newx][newy] = type; else data[newx][newy] = 3; if (temp == 2) break; newx += R_r_dx[i]; newy += R_r_dy[i]; temp = checkTheNext(newx , newy); } } } void B_b(int x, int y, int type) { for (int i = 0; i < 4; i++) { int temp; int newx = x + B_b_dx[i]; int newy = y + B_b_dy[i]; temp = checkTheNext(newx, newy); while (temp) { if (data[newx][newy] == 0 || data[newx][newy] == type) data[newx][newy] = type; else data[newx][newy] = 3; if (temp == 2) break; newx += B_b_dx[i]; newy += B_b_dy[i]; temp = checkTheNext(newx , newy); } } } void Q_q(int x, int y, int type) { for (int i = 0; i < 8; i++) { int temp; int newx = x + Q_q_dx[i]; int newy = y + Q_q_dy[i]; temp = checkTheNext(newx, newy); while (temp) { if (data[newx][newy] == 0 || data[newx][newy] == type) data[newx][newy] = type; else data[newx][newy] = 3; if (temp == 2) break; newx += Q_q_dx[i]; newy += Q_q_dy[i]; temp = checkTheNext(newx , newy); } } } void K_k(int x, int y, int type) { for (int i = 0; i < 8; i++) { int newx = x + K_k_dx[i]; int newy = y + K_k_dy[i]; if (checkTheNext(newx, newy)) { if (data[newx][newy] == 0 || data[newx][newy] == type) data[newx][newy] = type; else data[newx][newy] = 3; } } } void N_n(int x, int y, int type) { for (int i = 0; i < 8; i++) { int newx = x + N_n_dx[i]; int newy = y + N_n_dy[i]; if (checkTheNext(newx, newy)) { if (data[newx][newy] == 0 || data[newx][newy] == type) data[newx][newy] = type; else data[newx][newy] = 3; } } } int main() { int n = 0; int i, j; string str; #ifndef ONLINE_JUDGE freopen("10196.txt", "r", stdin); #endif int flag = 1; while (flag) { char temp; int point_size = 0; memset(data, 0, sizeof(data)); memset(flagData, 0, sizeof(flagData)); for (i = 0; i < 64; i++) { cin >> temp; int x = i / 8; int y = i % 8; image[x][y] = temp; if (temp != '.') flagData[x][y] = 1; else point_size++; if (temp == 'k') {blackKingX = x; blackKingY = y;} if (temp == 'K') {whiteKingX = x; whiteKingY = y;} } if (point_size == 64) break; else { for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { switch (image[i][j]) { case '.': break; case 'p': p(i, j); break; case 'P': P(i, j); break; case 'r': R_r(i, j, 1); break; case 'R': R_r(i, j, 2); break; case 'b': B_b(i, j, 1); break; case 'B': B_b(i, j, 2); break; case 'q': Q_q(i, j, 1); break; case 'Q': Q_q(i, j, 2); break; case 'k': K_k(i, j, 1); break; case 'K': K_k(i, j, 2); break; case 'n': N_n(i, j, 1); break; case 'N': N_n(i, j, 2); break; } } } cout << "Game #" << ++n << ": "; if (data[whiteKingX][whiteKingY] == 1 || data[whiteKingX][whiteKingY] == 3) { cout << "white king is in check." << endl; } else if (data[blackKingX][blackKingY] == 2 || data[blackKingX][blackKingY] == 3) { cout << "black king is in check." << endl; } else { cout << "no king is in check." << endl; } } } return 0; }