问题描述:在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
class Solution { public: int onedirection(vector<vector<char>>& board, int i, int j, char dir) {//从(i,j)向dir这个方向出发,寻找p if (dir == 'u') { while (j > 0) { j--; if (board[i][j] == 'p') { return 1; } if (board[i][j] == 'B') { return 0; } } return 0; } if (dir == 'd') { while (j < 7) { j++; if (board[i][j] == 'p') { return 1; } if (board[i][j] == 'B') { return 0; } } return 0; } if (dir == 'l') { while (i > 0) { i--; if (board[i][j] == 'p') { return 1; } if (board[i][j] == 'B') { return 0; } } return 0; } if (dir == 'r') { while (i < 7) { i++; if (board[i][j] == 'p') { return 1; } if (board[i][j] == 'B') { return 0; } } return 0; } return -1;//因为要保证必须有一个return, 否则编译不能通过 } int numRookCaptures(vector<vector<char>>& board) { int res = 0; int i, j; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { if (board[i][j] == 'R') {//寻找R res += onedirection(board, i, j, 'u'); res += onedirection(board, i, j, 'd'); res += onedirection(board, i, j, 'l'); res += onedirection(board, i, j, 'r'); return res; } } } return -1;//因为要保证必须有一个return, 否则编译不能通过 } };