LeetCode——999.车的可用捕获量js

本文介绍了一个算法,用于计算国际象棋中白色车在8x8棋盘上能够一次移动捕获到的黑色卒数量。通过分析棋盘布局,避免与友方象冲突,实现对卒的有效捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

在一个 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

解法:
  var numRookCaptures = function (board) {
            var b = 0, Iindex = 0, Jindex = 0;
            //获取车的位置;
            top: for (var i = 0; i < board.length; i++) {
                for (var j = 0; j < board[i].length; j++) {
                    if (board[i][j] === "R") {
                        Iindex = i;
                        Jindex = j;
                        break top;
                    }
                }
            }
           /*判断车的上下左右距离其最近的棋子
             如果是象,不操作,跳出循坏,表示距离其最近的是象,则捕获不到卒。
            如果是卒,b++,此时跳出循环,表示一侧有多个卒时只能捕获到一个。*/
            for (var n = Jindex; n > 0; n--) {    //左
                if (board[Iindex][n] === "p") {
                    b++; break;
                }
                if (board[Iindex][n] === "B") {
                    break;
                }
            }
            for (var t = Jindex; t < 8; t++) {   //右
                if (board[Iindex][t] === "p") {
                    b++; 
                    break;
                }
                if (board[Iindex][t] === "B") {
                    break;
                } 
            }   
            for (var m = Iindex; m > 0; m--) { //上
                if (board[m][Jindex] === "p") {
                    b++; break;
                }
                if (board[m][Jindex] === "B") {
                    break;
                }
            }
            for (var o = Iindex; o < 8; o++) { //下
                if (board[o][Jindex] === "p") {
                    b++; break;
                }
                if (board[o][Jindex] === "B") {
                    break;
                }
            }
            return b;
        };
运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小端长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值