[Leedcode][JAVA][第999题][直接考虑题意]
【问题描述】
在一个 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/
【总结】
- 方向函数
// 定义上下左右四个方向int[] dx = {-1, 1, 0, 0};int[] dy = {0, 0, -1, 1};
2.直接考虑题意,面试时类似题目,多思考多问多沟通
[Leedcode][JAVA][第999题][直接考虑题意]相关推荐
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]
[问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...
- [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]
[问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...
- [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]
[问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...
- [Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]
[问题描述][第210 题][课程表 II][中等] 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用 ...
- [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]
[问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...
- [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]
[问题描述][第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数.示例 1 :输入:nums = [1,1,1], k = 2 输 ...
最新文章
- python使用matplotlib, seaborn画图时候的数据加载
- JAVA之JVM知识汇总
- 进阶学习(3.8) Component Pattern 组合模式
- Huggingface简介及BERT tansformer 开源
- java wav 时间,Java-调整WAV文件的播放速度
- python编程小知识_分享Python开发中要注意的十个小贴士
- 什么是反射和字节码对象。
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
- Eclipse——恢复的默认窗口设置篇
- 人工智能和机器学习的前世今生
- stl reserve_vector :: reserve()函数以及C ++ STL中的示例
- 故宫开通首个5G基站 首个5G高校在上海建成启用...
- 如何在思科虚拟PC机信息进行修改
- jenkins--master/slave模式---master是容器版---slave是非容器版
- 【周志华机器学习】总目录
- 【揭示网页挂马技术的秘密(转网络安全)】
- stc单片机id加密c语言,STC单片机内部ID读取
- Python sklearn针对不同人群的差异化保险费用定价方案
- 局域网对战平台 linux,在Linux下可用Wine安装和运行腾讯对战平台、5E对战平台
- 什么是抽象类,什么情况下会用到抽象类?
热门文章
- HDU/HDOJ 2612 Find a way 双向BFS
- Linux 服务器远程控制三剑客Telnet、SSH 和 VNC 之 VNC
- 16-Flutter移动电商实战-切换后页面状态的保持AutomaticKeepAliveClientMixin
- @ConfigurationProperties + @EnableConfigurationProperties
- android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base
- android 多选项实现
- div中图片下方有边距
- 宝塔面板 Windows 2012 R2 使用指南(在更新中)
- js jquery Ajax同步
- sklearn中的make_blobs的用法