【问题描述】

在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。示例 1:输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够捕获所有的卒。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/available-captures-for-rook

【解答思路】

1. 先找出 ”车“的位置 ,再找出所有“卒”的位置,如果他们之间没有“象”和"卒",则吃“卒”数+1 时间复杂度:O(N^2) 空间复杂度:O(1)
  public int numRookCaptures(char[][] board) {int num = 0;int  x=0 ,y=0;//找出 ”车“的位置for(int i = 0 ; i < board.length ;i++ ){for(int j = 0 ;j< board[0].length;j++){if( board[i][j]== 'R'){x = i;y = j;}}}//找出所有“卒”的位置,如果他们之间没有“象”和"卒",则吃“卒”数+1 for(int i = 0 ; i < board.length ;i++ ){for(int j = 0 ;j< board[0].length;j++){if( board[i][j]== 'p'){if(i == x){boolean flag= true;for(int k =Math.min(j, y)+1; k<Math.max(j, y);k++){if( board[i][k]== 'B'||board[i][k]== 'p')flag= false;}if(flag){num++;}}if(j== y){boolean flag= true;for(int k =Math.min(i, x)+1; k<Math.max(i, x);k++){if( board[k][j]== 'B'||board[k][j]== 'p')flag= false;}if(flag){num++;}}}}}return num;}

​###### 2. 方向函数(伟哥做法-工程代码) 时间复杂度:(N^2) 空间复杂度:O(1)
)

  • 遍历棋盘确定白色车的下标,用 (st,ed)(st,ed) 表示。
  • 模拟车移动的规则,朝四个基本方向移动,直到碰到卒或者白色象或者碰到棋盘边缘时停止,用 cnt 记录捕获到的卒的数量
public class Solution {public int numRookCaptures(char[][] board) {// 因为题目已经明确给出 board.length == board[i].length == 8,所以不做输入检查// 定义方向数组,可以认为是四个方向向量,在棋盘问题上是常见的做法int[][] directions = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {if (board[i][j] == 'R') {int res = 0;for (int[] direction : directions) {if (burnout(board, i, j, direction)) {res++;}}return res;}}}// 代码不会走到这里,返回 0 或者抛出异常均可return 0;}/*** 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;}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;}public static void main(String[] args) {char[][] board = {{'.', '.', '.', '.', '.', '.', '.', '.'},{'.', '.', '.', 'p', '.', '.', '.', '.'},{'.', '.', '.', 'R', '.', '.', '.', 'p'},{'.', '.', '.', '.', '.', '.', '.', '.'},{'.', '.', '.', '.', '.', '.', '.', '.'},{'.', '.', '.', 'p', '.', '.', '.', '.'},{'.', '.', '.', '.', '.', '.', '.', '.'},{'.', '.', '.', '.', '.', '.', '.', '.'}};Solution solution = new Solution();int res = solution.numRookCaptures(board);System.out.println(res);}
}作者:liweiwei1419
链接:https://leetcode-cn.com/problems/available-captures-for-rook/solution/mo-ni-ti-an-zhao-ti-mu-yi-si-shi-xian-ji-ke-java-b/

​###### 4. 方向函数(甜姨做法-机智代码) 时间复杂度:(N^2) 空间复杂度:O(1)

class Solution {public int numRookCaptures(char[][] board) {// 定义上下左右四个方向int[] dx = {-1, 1, 0, 0};int[] dy = {0, 0, -1, 1};for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {// 找到白车所在的位置if (board[i][j] == 'R') {// 分别判断白车的上、下、左、右四个方向int res = 0;for (int k = 0; k < 4; k++) {int x = i, y = j;while (true) {x += dx[k];y += dy[k];if (x < 0 || x >= 8 || y < 0 || y >= 8 || board[x][y] == 'B') {break;}if (board[x][y] == 'p') {res++;break;}}}return res;}}}return 0;}
}作者:sweetiee
链接:https://leetcode-cn.com/problems/available-captures-for-rook/solution/jian-dan-java100-by-sweetiee/

【总结】

  1. 方向函数
    // 定义上下左右四个方向int[] dx = {-1, 1, 0, 0};int[] dy = {0, 0, -1, 1};

2.直接考虑题意,面试时类似题目,多思考多问多沟通

[Leedcode][JAVA][第999题][直接考虑题意]相关推荐

  1. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  2. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  3. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  4. [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]

    [问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...

  5. [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]

    [问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...

  6. [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

    [问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...

  7. [Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

    [问题描述][第210 题][课程表 II][中等] 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用 ...

  8. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

  9. [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

    [问题描述][第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数.示例 1 :输入:nums = [1,1,1], k = 2 输 ...

最新文章

  1. python使用matplotlib, seaborn画图时候的数据加载
  2. JAVA之JVM知识汇总
  3. 进阶学习(3.8) Component Pattern 组合模式
  4. Huggingface简介及BERT tansformer 开源
  5. java wav 时间,Java-调整WAV文件的播放速度
  6. python编程小知识_分享Python开发中要注意的十个小贴士
  7. 什么是反射和字节码对象。
  8. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  9. Eclipse——恢复的默认窗口设置篇
  10. 人工智能和机器学习的前世今生
  11. stl reserve_vector :: reserve()函数以及C ++ STL中的示例
  12. 故宫开通首个5G基站 首个5G高校在上海建成启用...
  13. 如何在思科虚拟PC机信息进行修改
  14. jenkins--master/slave模式---master是容器版---slave是非容器版
  15. 【周志华机器学习】总目录
  16. 【揭示网页挂马技术的秘密(转网络安全)】
  17. stc单片机id加密c语言,STC单片机内部ID读取
  18. Python sklearn针对不同人群的差异化保险费用定价方案
  19. 局域网对战平台 linux,在Linux下可用Wine安装和运行腾讯对战平台、5E对战平台
  20. 什么是抽象类,什么情况下会用到抽象类?

热门文章

  1. HDU/HDOJ 2612 Find a way 双向BFS
  2. Linux 服务器远程控制三剑客Telnet、SSH 和 VNC 之 VNC
  3. 16-Flutter移动电商实战-切换后页面状态的保持AutomaticKeepAliveClientMixin
  4. @ConfigurationProperties + @EnableConfigurationProperties
  5. android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base
  6. android 多选项实现
  7. div中图片下方有边距
  8. 宝塔面板 Windows 2012 R2 使用指南(在更新中)
  9. js jquery Ajax同步
  10. sklearn中的make_blobs的用法