Leecode 999. 车的可用捕获量

简介: Leecode 999. 车的可用捕获量

题目描述:

在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “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 的卒。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/available-captures-for-rook

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:这种题一般是用在笔试面试的第一题或者程序设计比赛的签到题,现实中的模型让你抽象的用程序解决该问题,我们使用遍历的方式,探索车周围四个方向上有没有卒并判断在车周围向四周扩散的时候有没有象,有象的话就直接退出break

public class Solution {
    public int numRookCaptures(char[][] board) {
        // 因为题目已经明确给出 board.length == board[i].length == 8,为此不做输入检查
        // 定义方向数组,可以认为是四个方向向量,在棋盘问题上是常见的做法
        int[][] directions = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
        int res = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (board[i][j] == 'R') {
                    for (int[] direction : directions) {
                        if (burnout(board, i, j, direction)) {
                            res++;
                        }
                    }
                }
            }
        }
        return res;
    }
    /**
     * burnout 横冲直撞的意思(来自欧路词典)
     *
     * @param board     输入棋盘
     * @param x         当前白象位置的横坐标
     * @param y         当前白象位置的纵坐标
     * @param direction 方向向量
     * @return 消灭一个 p,就返回 true
     */
    private boolean burnout(char[][] board, int x, int y, int[] direction) {
        int i = x;
        int j = y;
        while (inArea(i, j)) {
            // 当遇到象的时候,是友军,路被堵死,直接返回
            if (board[i][j] == 'B') {
                break;
            }
            //当遇到卒的时候 是敌军,拿下一血(不知道一血这个词是不是这么用的)
            if (board[i][j] == 'p') {
                return true;
            }
      //横向量与横向量相加减,列向量与列向量相加减,direction[0]为横向量,direction[1]为列向量
            i += direction[0];
            j += direction[1];
        }
        return false;
    }
    /**
     * @param i 当前位置横坐标
     * @param j 当前位置纵坐标
     * @return 是否在棋盘有效范围内
     */
    private boolean inArea(int i, int j) {
        return i >= 0 && i < 8 && j >= 0 && j < 8;
    }
}


相关文章
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
|
算法
LeetCode每日一题——1710. 卡车上的最大单元数
整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。
141 0
Leecode 914.卡牌分组
Leecode 914.卡牌分组
90 0
|
新零售 搜索推荐 数据可视化
【云栖号案例 | 制造】4大兵器在手 奇瑞实现连续7个月销售上涨
中国车市低迷 奇瑞采用用户全生命周期理念,实现线上线下营销场景打通,整合所有线上渠道,实现资源集中统一管理,构建统一素材库,降低开发运营成本。
【云栖号案例 | 制造】4大兵器在手 奇瑞实现连续7个月销售上涨
|
Java 测试技术
Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一
Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一
151 0
|
新零售 大数据
9月21日科技联播:报告显示网约车案发率低于传统出租车;刘强东性侵案已移交美国检方
最高法大数据:出租车案发率约为网约车13倍!刘强东性侵案初步调查结束已移交检方,一旦起诉刘强东将会被重新逮捕;中美贸易关系紧张,马云收回对特朗普的承诺,阿里巴巴或无法为美国新增100万就业;一起来看今天的科技快讯!
1591 0

热门文章

最新文章