【从零开始的LeetCode-算法】999. 可以被一步捕获的棋子数

发布于:2024-12-08 ⋅ 阅读:(120) ⋅ 点赞:(0)

给定一个 8 x 8 的棋盘,只有一个 白色的车,用字符 'R' 表示。棋盘上还可能存在白色的象 'B' 以及黑色的卒 'p'。空方块用字符 '.' 表示。

车可以按水平或竖直方向(上,下,左,右)移动任意个方格直到它遇到另一个棋子或棋盘的边界。如果它能够在一次移动中移动到棋子的方格,则能够 吃掉 棋子。

注意:车不能穿过其它棋子,比如象和卒。这意味着如果有其它棋子挡住了路径,车就不能够吃掉棋子。

返回白车将能 吃掉卒的数量

示例 1:

输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够吃掉所有的卒。

示例 2:

输入:[[".",".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:0
解释:
象阻止了车吃掉任何卒。

示例 3:

输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释: 
车可以吃掉位置 b5,d6 和 f5 的卒。

提示:

  1. board.length == 8
  2. board[i].length == 8
  3. board[i][j] 可以是 'R''.''B' 或 'p'
  4. 只有一个格子上存在 board[i][j] == 'R'

我的解答

class Solution {
    public int numRookCaptures(char[][] board) {
        int res = 0;
        for(int y = 0; y < 8; y++){
            for(int x = 0; x < 8; x++){
                // 找到车的位置
                if(board[y][x] == 'R'){
                    // 遍历车左边的格子
                    for(int l_x = x - 1; l_x >= 0; l_x-- )
                    {
                        if(board[y][l_x] != '.'){
                            res += board[y][l_x] == 'p' ? 1 : 0;
                            break;
                        }
                    }
                    // 遍历车右边的格子
                    for(int r_x = x + 1; r_x < 8; r_x++ ){
                        if(board[y][r_x] != '.'){
                            res += board[y][r_x] == 'p' ? 1 : 0;
                            break;
                        }
                    }
                    // 遍历车上方的格子
                    for(int o_y = y - 1;o_y >= 0; o_y-- ){
                        if(board[o_y][x] != '.'){
                            res += board[o_y][x] == 'p' ? 1 : 0;
                            break;
                        }
                    }
                    // 遍历车下方的格子
                    for(int d_y = y + 1;d_y < 8; d_y++ ){
                        if(board[d_y][x] != '.'){
                            res += board[d_y][x] == 'p' ? 1 : 0;
                            break;
                        }
                    }
                }
            }
        }
        return res;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到