#include <iostream> #include <cstdlib> using namespace std; char Map[8][8]; // 表示国际象棋棋子的位置。 // 检查坐标为(king_x,king_y)的王是否在坐标为(x,y)的卒攻击范围内,注意进攻方向的不同。 bool check_Pp (int x, int y, int king_x, int king_y) { return (x - king_x) == 1 && abs(y - king_y) == 1; } // 检查坐标为(king_x,king_y)的王是否在坐标为(x,y)的马攻击范围内。 bool check_Nn (int x, int y, int king_x, int king_y) { return (abs(x - king_x) == 2 && abs(y - king_y) == 1) || (abs(x - king_x) == 1 && abs(y - king_y) == 2); } // 检查坐标为(king_x,king_y)的王是否在坐标为(x,y)的象攻击范围内。 bool check_Bb (int x, int y, int king_x, int king_y) { int step, current_x = x, current_y = y, direct_x, direct_y; bool checked = false; // 检查象与王是否处于对角线。 if (abs(x - king_x) == abs(y - king_y)) { checked = true; // 判断相对方位。 direct_x = (x < king_x) ? 1 : -1; direct_y = (y < king_y) ? 1 : -1; // 是否有棋子相隔。 step = abs (x - king_x); while (step > 1) { current_x += direct_x; current_y += direct_y; if (Map[current_x][current_y] != '.') { checked = false; break; } step--; } } return checked; } // 检查坐标为(king_x,king_y)的王是否在坐标为(x,y)的车攻击范围内。 bool check_Rr (int x, int y, int king_x, int king_y) { int step, current_x = x, current_y = y, direct_x = 0, direct_y = 0; bool checked = false; // 车与王是否在同一行或者同一列,车与王之间是否有棋子相隔。 if (x == king_x || y == king_y) { checked = true; // 判断相对方位。 direct_x = (x == king_x) ? (0) : (x < king_x ? 1 : -1); direct_y = (y == king_y) ? (0) : (y < king_y ? 1 : -1); // 是否有棋子相隔。 step = (direct_x == 0) ? abs(y - king_y) : abs(x - king_x); while (step > 1) { current_x += direct_x; current_y += direct_y; if (Map[current_x][current_y] != '.') { checked = false; break; } step--; } } return checked; } // 检查坐标为(king_x,king_y)的王是否在坐标为(x,y)的王后攻击范围内。 bool check_Qq(int x, int y, int king_x, int king_y) { return check_Rr(x, y, king_x, king_y) || check_Bb(x, y, king_x, king_y); } // 检查给定棋盘状态是否存在将军局面。 void check (int cas) { bool bChecked = false, white_checked = false; int b_king_x = -1, b_king_y = -1, w_king_x = -1, w_king_y = -1; int direct_x = 0, direct_y = 0, current_x = 0, current_y = 0, step = 0; // 查找白棋和黑棋王的位置。 for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { if (Map[i][j] == 'k') { b_king_x = i; b_king_y = j; } if (Map[i][j] == 'K') { w_king_x = i; w_king_y = j; } } // 假如未找到王的坐标,表明为空棋盘。 if (b_king_x == -1) return; cout << "Game #" << cas << ": "; // 检查棋子与王的是否存在将军情况。 for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { switch (Map[i][j]) { // 黑卒。 case 'p': white_checked = check_Pp(w_king_x, w_king_y, i, j); break; // 白卒。 case 'P': bChecked = check_Pp(i, j, b_king_x, b_king_y); break; // 黑马。 case 'n': white_checked = check_Nn(i, j, w_king_x, w_king_y); break; // 白马。 case 'N': bChecked = check_Nn(i, j, b_king_x, b_king_y); break; // 黑象。 case 'b': white_checked = check_Bb(i, j, w_king_x, w_king_y); break; // 白象。 case 'B': bChecked = check_Bb(i, j, b_king_x, b_king_y); break; // 黑车。 case 'r': white_checked = check_Rr(i, j, w_king_x, w_king_y); break; // 白车。 case 'R': bChecked = check_Rr(i, j, b_king_x, b_king_y); break; // 黑后。 case 'q': white_checked = check_Qq(i, j, w_king_x, w_king_y); break; // 白后。 case 'Q': bChecked = check_Qq(i, j, b_king_x, b_king_y); break; // 其他情况。 default: break; } // 检查将军情况是否存在。 if (bChecked) { cout << "black king is in check." << endl; return; } if (white_checked) { cout << "white king is in check." << endl; return; } } cout << "no king is in check." << endl; } int main () { string tmp; int cas = 1, num = 0; while (getline(cin, tmp)) { if (tmp != "") { for (int i = 0; i < 8; i++) Map[num][i] = tmp[i]; num++; } else { check(cas); cas++; num = 0; } } return 0; }