【LeetCode: 999. 可以被一步捕获的棋子数 + 模拟】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

在这里插入图片描述

🚩 题目链接

⛲ 题目描述

给定一个 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 的卒。

提示:

board.length == 8
board[i].length == 8
board[i][j] 可以是 ‘R’,‘.’,‘B’ 或 ‘p’
只有一个格子上存在 board[i][j] == ‘R’

🌟 求解思路&实现代码&运行结果


⚡ 模拟

🥦 求解思路
  1. 先找到车的位,然后从车的位置开始,上下左右遍历,找到可以干掉的卒,注意:如果象,或者卒在卒的前边,直接结束。
  2. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {
    public int numRookCaptures(char[][] board) {
        // 先找到车的位置
        int r_row = 0, r_col = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (board[i][j] == 'R') {
                    r_row = i;
                    r_col = j;
                    break;
                }
            }
        }
        // 从车的位置开始,上下左右遍历,找到可以干掉的卒,注意:如果象在卒的前边,直接结束
        int res = 0;
        int[][] dirs = new int[][] { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
        for (int[] dir : dirs) {
            int nextX = dir[0], nextY = dir[1];
            res += killPNum(board, r_row, r_col, nextX, nextY);
        }
        return res;
    }

    // 返回可以干掉的卒
    public int killPNum(char[][] board, int curX, int curY, int nextX, int nextY) {
        int cnt = 0;
        int i = curX + nextX, j = j = curY + nextY;
        while (i < 8 && i >= 0 && j < 8 && j >= 0) {
            if (board[i][j] == 'B') {
                break;
            }
            if (board[i][j] == 'p') {
                cnt++;
                break;
            }
            i += nextX;
            j += nextY;
        }
        return cnt;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

硕风和炜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值