(挑战编程_1_7)Check The Check
2013-05-25 12:33
197 查看
题目链接:http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110107&format=html
#include <iostream> #include <cstdio> #include <string> using namespace std; // 棋盘边界 const int BOARD = 8; // 棋盘,尝试从1开始 char chessboard[BOARD + 1][BOARD + 1]; /* 读入棋盘,并且返回是否结束标志 */ bool InitChessBoard(); /* 处理棋盘 */ void HandleChessBoard(int count); /* 判断x、y是否超出边界 */ bool IsOutOfBound(int x, int y); /* 卒的情况: 传入卒子的位置、大小写情况,判断是否将军 */ bool IsPawnOK(int x, int y, char p); /* 车: 传入车的位置、大小写情况,判断是否将军 注意不能越过去! */ bool IsRookOK(int x, int y, char p); bool IsRookOKHelp(int x, int y, char k); /* 象: 传入车的位置、大小写情况,判断是否将军 注意不能越过去! */ bool IsBishopOK(int x, int y, char p); bool IsBishopOKHelp(int x, int y, char k); /* 皇后 */ bool IsQueenOK(int x, int y, char p); int knightMap[8][2] = { -1, 2, -2, 1, -2, -1, -1, -2, 1, -2, 2, -1, 2, 1, 1, 2 }; /* 马 */ bool IsKnightOK(int x, int y, char p); bool IsKnightOKHelp(int x, int y, char p); /* 国王: */ bool IsKingOK(int x, int y, char p); bool IsKingOKHelp(int x, int y, char p); int kingMap[8][2] = { -1, 0, -1, 1, 0, 1, 1, 1, 1, 0, 1, -1, 0, -1, -1, -1 }; /* 测试程序 */ void Test() { //chessboard[1][1] = 'r'; //chessboard[1][2] = 'n'; //chessboard[1][3] = 'b'; //chessboard[1][4] = 'q'; //chessboard[1][5] = 'k'; //chessboard[1][6] = '.'; //chessboard[1][7] = 'n'; //chessboard[1][8] = 'r'; //chessboard[2][1] = 'p'; //chessboard[2][2] = 'p'; //chessboard[2][3] = 'p'; //chessboard[2][4] = '.'; //chessboard[2][5] = '.'; //chessboard[2][6] = 'p'; //chessboard[2][7] = 'p'; //chessboard[2][8] = 'p'; //chessboard[3][1] = '.'; //chessboard[3][2] = '.'; //chessboard[3][3] = '.'; //chessboard[3][4] = '.'; //chessboard[3][5] = 'p'; //chessboard[3][6] = '.'; //chessboard[3][7] = '.'; //chessboard[3][8] = '.'; //chessboard[4][1] = '.'; //chessboard[4][2] = '.'; //chessboard[4][3] = '.'; //chessboard[4][4] = 'p'; //chessboard[4][5] = '.'; //chessboard[4][6] = '.'; //chessboard[4][7] = '.'; //chessboard[4][8] = '.'; //chessboard[5][1] = '.'; //// //chessboard[5][2] = '.'; //chessboard[5][3] = 'P'; //chessboard[5][4] = 'P'; //chessboard[5][5] = '.'; //chessboard[5][6] = '.'; //chessboard[5][7] = '.'; //chessboard[5][8] = '.'; //chessboard[6][1] = '.'; //chessboard[6][2] = '.'; //chessboard[6][3] = '.'; //chessboard[6][4] = '.'; //chessboard[6][5] = '.'; //chessboard[6][6] = 'N'; //chessboard[6][7] = '.'; //chessboard[6][8] = '.'; // //chessboard[7][1] = 'P'; //chessboard[7][2] = 'P'; //chessboard[7][3] = '.'; //chessboard[7][4] = '.'; //chessboard[7][5] = 'P'; //chessboard[7][6] = 'P'; //chessboard[7][7] = 'P'; //chessboard[7][8] = 'P'; //chessboard[8][1] = 'R'; //chessboard[8][2] = 'N'; //chessboard[8][3] = 'B'; //chessboard[8][4] = 'Q'; //chessboard[8][5] = 'K'; //chessboard[8][6] = 'B'; //chessboard[8][7] = '.'; //chessboard[8][8] = 'R'; //HandleChessBoard(1); string str; getline(cin, str); cout << str << endl; getline(cin, str); cout << str << endl; getline(cin, str); cout << str << endl; } int main() { //cout << "Test" << endl; //读入棋盘 int count = 1; bool isFinish = InitChessBoard(); // 判断是否结束 while (!isFinish) { // 处理棋盘 HandleChessBoard(count++); // 略过空行 string str; getline(cin, str); getline(cin, str); // 初始化棋盘 isFinish = InitChessBoard(); } //Test(); return 0; } bool InitChessBoard() { // 如果有王说明没结束,否则说明结束了 int count = 0; // 要读入的char char ch; for (int i = 1; i <= BOARD; ++i) { for (int j = 1; j <= BOARD; ++j) { cin >> ch; if (ch == '.') { ++count; } chessboard[i][j] = ch; } } if (count == BOARD * BOARD) { return true; } return false; } void HandleChessBoard(int count) { // 黑王是否被将 bool isBlackCheck = false; // 白王是否被将 bool isWriteCheck = false; // 只要有一个被将,则停止 for (int i = 1; i <= BOARD && !isBlackCheck && !isWriteCheck; ++i) { for (int j = 1; j <= BOARD && !isBlackCheck && !isWriteCheck; ++j) { char ch = chessboard[i][j]; switch(ch) { case 'p': isWriteCheck = IsPawnOK(i, j, ch); break; case 'P': isBlackCheck = IsPawnOK(i, j, ch); break; case 'n': isWriteCheck = IsKnightOK(i, j, ch); break; case 'N': isBlackCheck = IsKnightOK(i, j, ch); break; case 'b': isWriteCheck = IsBishopOK(i, j, ch); break; case 'B': isBlackCheck = IsBishopOK(i, j, ch); break; case 'r': isWriteCheck = IsRookOK(i, j, ch); break; case 'R': isBlackCheck = IsRookOK(i, j, ch); break; case 'q': isWriteCheck = IsQueenOK(i, j, ch); break; case 'Q': isBlackCheck = IsQueenOK(i, j, ch); break; //case 'k': // isWriteCheck = IsKingOK(i, j, ch); // break; //case 'K': // isBlackCheck = IsKingOK(i, j, ch); // break; } } } if (isBlackCheck) { cout << "Game #" << count << ": black king is in check." << endl; //printf("Game #%d: black king is in check.\n", count); } else if (isWriteCheck) { // 他妈的!!!一个单词打错了!!!white->write cout << "Game #" << count << ": white king is in check." << endl; //printf("Game #%d: white king is in check.\n", count); } else { cout << "Game #" << count << ": no king is in check." << endl; //printf("Game #%d: no king is in check.\n", count); } } bool IsPawnOK(int x, int y, char p) { // 黑方卒子 if (p == 'p') { // 左下角 int nX = x + 1; int nY = y - 1; // 判断是否超出边界 if (!IsOutOfBound(nX, nY)) { // 判断是否可以将军 if (chessboard[nX][nY] == 'K') { return true; } } // 右下角 nX = x + 1; nY = y + 1; // 判断是否超出边界 if (!IsOutOfBound(nX, nY)) { // 判断是否可以将军 if (chessboard[nX][nY] == 'K') { return true; } } } // 白方卒子 if (p == 'P') { // 左上角 int nX = x - 1; int nY = y - 1; // 判断是否超出边界 if (!IsOutOfBound(nX, nY)) { // 判断是否可以将军 if (chessboard[nX][nY] == 'k') { return true; } } // 右上角 nX = x - 1; nY = y + 1; // 判断是否超出边界 if (!IsOutOfBound(nX, nY)) { // 判断是否可以将军 if (chessboard[nX][nY] == 'k') { return true; } } } return false; } bool IsOutOfBound(int x, int y) { if (x >= 1 && x <= BOARD && y >= 1 && y <= BOARD) { return false; } return true; } bool IsRookOK(int x, int y, char r) { // 黑车 if (r == 'r') { return IsRookOKHelp(x, y, 'K'); } if (r == 'R') { return IsRookOKHelp(x, y, 'k'); } } bool IsRookOKHelp(int x, int y, char k) { // 四个方向延伸 // 1.向下 for (int i = x + 1; i <= BOARD; ++i) { // 不能出界而且没有棋子 if (IsOutOfBound(i, y)) { break; } if (chessboard[i][y] != '.') { if (chessboard[i][y] == k) { return true; } break; } } // 2.向上 for (int i = x - 1; i >= 1; --i) { // 不能出界而且没有棋子 if (IsOutOfBound(i, y)) { break; } if (chessboard[i][y] != '.') { if (chessboard[i][y] == k) { return true; } break; } } // 3.向左 for (int i = y - 1; i >= 1; --i) { // 不能出界而且没有棋子 if (IsOutOfBound(x, i)) { break; } if (chessboard[x][i] != '.') { if (chessboard[x][i] == k) { return true; } break; } } // 4.向右 for (int i = y + 1; i <= BOARD; ++i) { // 不能出界而且没有棋子 if (IsOutOfBound(x, i)) { break; } if (chessboard[x][i] != '.') { if (chessboard[x][i] == k) { return true; } break; } } return false; } bool IsBishopOKHelp(int x, int y, char k) { // 四个方向延伸 // 1.向右下 for (int i = x + 1, j = y + 1; i <= BOARD && j <= BOARD; ++i, ++j) { // 不能出界而且没有棋子 if (IsOutOfBound(i, j)) { break; } if (chessboard[i][j] != '.') { if (chessboard[i][j] == k) { return true; } break; } } // 2.向左上 for (int i = x - 1, j = y - 1; i >= 1 && j >= 1; --i, --j) { // 不能出界而且没有棋子 if (IsOutOfBound(i, j)) { break; } if (chessboard[i][j] != '.') { if (chessboard[i][j] == k) { return true; } break; } } // 3.向右上:x--、y++ for (int i = x - 1, j = y + 1; i >= 1 && j <= BOARD; --i, ++j) { // 不能出界而且没有棋子 if (IsOutOfBound(i, j)) { break; } if (chessboard[i][j] != '.') { if (chessboard[i][j] == k) { return true; } break; } } // 4.向左下:x++、y-- for (int i = x + 1, j = y - 1; i <= BOARD && j >= 1; ++i, --j) { // 不能出界而且没有棋子 if (IsOutOfBound(i, j)) { break; } if (chessboard[i][j] != '.') { if (chessboard[i][j] == k) { return true; } break; } } return false; } bool IsBishopOK(int x, int y, char p) { // 黑象 if (p == 'b') { return IsBishopOKHelp(x, y, 'K'); } if (p == 'B') { return IsBishopOKHelp(x, y, 'k'); } } bool IsQueenOK(int x, int y, char p) { if (p == 'q') { return (IsRookOK(x, y, 'r') || IsBishopOK(x, y, 'b')); } if (p == 'Q') { return (IsRookOK(x, y, 'R') || IsBishopOK(x, y, 'B')); } } bool IsKnightOKHelp(int x, int y, char p) { for (int i = 0; i < 8; ++i) { int nX = x + knightMap[i][0]; int nY = y + knightMap[i][1]; if (IsOutOfBound(nX, nY)) { continue; } if (chessboard[nX][nY] == p) { return true; } } return false; } bool IsKnightOK(int x, int y, char p) { if (p == 'n') { return IsKnightOKHelp(x, y, 'K'); } if (p == 'N') { return IsKnightOKHelp(x, y, 'k'); } } bool IsKingOK(int x, int y, char p) { if (p == 'k') { return IsKingOKHelp(x, y, 'K'); } if (p == 'K') { return IsKingOKHelp(x, y, 'k'); } } bool IsKingOKHelp(int x, int y, char p) { for (int i = 0; i < 8; ++i) { int nX = x + kingMap[i][0]; int nY = y + kingMap[i][1]; if (IsOutOfBound(nX, nY)) { continue; } if (chessboard[nX][nY] == p) { return true; } } return false; }
相关文章推荐
- 挑战编程 程序设计竞赛训练手册-1.6.7 将军(Check_the_Check)
- 挑战编程题目1(The&nbsp;3n+1&nbsp;Problem…
- 《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习
- 《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习
- (挑战编程_9_3)The Tourist Guide
- (挑战编程_13_3)The Knights Of The Round Table
- 编程挑战系统的输入和输出详细说明
- Scripts to Check the Setup of the General Ledger Calendar
- SMB的NTLM认证过程与NTLM挑战的编程实现
- The Agile Checklist
- UVA 10196 Check The Check(模拟)
- nagios配置pnp4nagios报错“Please check the documentation for information about the following error”
- Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted(待解决)
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
- POJ 2151 Check the difficulty of problems(DP)
- check the manual that corresponds to your MySQL server version for the right syntax的解决方法
- JavaScript 编程珠玑 - 《JavaScript: The good parts》总结(1)
- Java并发(二)—— 并发编程的挑战 与 并发机制的底层原理
- 解决Configuration is faulty. Check the Issues view for details. Error while building/deploying project
- POJ2151----Check the difficulty of problems(概率dp)