999. 车的可用捕获量
题目:
在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/available-captures-for-rook
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1.分析
- 理解题意
首先,对题目进行大致的提炼,8 x 8 的棋盘就是8 x 8举证。在矩阵中,分别有 “R”,“.”,“B” 和 “p”。R 所在的 x , y 轴上,如果遇到 p 就返回 1,如果遇到 B 或者到达边界了,直接就返回 0 .
2.设计
先通过遍历棋盘,得到白车的坐标,然后对上下左右四个方向进行遍历;
- 如果遇到 .(表示空格)就可以继续朝同一个方向前进,直到不能再走为止(到达边缘);
- 如果遇到 B (白色的象)就停止找(原话是:车不能与其他友方(白色)象进入同一个方格,意思就是:白色全是你的队友,我们不能误伤队友);
- 如果遇到 p(黑色的卒) 说明找到了,停止,计数加一。
3.实现
package com.sq;
/**
* @Author: iamasd
* @Description:
* @Date: Created in 14:252020/3/26
*/
public class Test10 {
public static int q = 0,p = 0;
public static void main(String[] args) {
char[][] board = {{'.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', 'p', '.', '.', '.', '.'},
{'.', '.', '.', 'R', '.', '.', '.', 'p'},
{'.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', 'p', '.', '.', '.', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.'}};
int i = numRookCaptures(board);
System.out.println(i);
}
public static int numRookCaptures(char[][] board) {
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
//找到R的位置
if(board[i][j]=='R'){
//以R 为原点建立坐标系
//依次向上找,向下找,向右找,向左找
return cap(board,i,j,0,1)+cap(board,i,j,0,-1)+cap(board,i,j,1,0)+cap(board,i,j,-1,0);
}
}
}
return 0;
}
public static int cap(char[][] a,int x,int y,int dx,int dy){
/*参数说明
*a为原数组矩阵
*x,y为R的坐标
*dx,dy为增长步长
*/
while(x>=0 && x<a.length && y>=0 && y<a[x].length && a[x][y]!='B'){
if(a[x][y]=='p'){
return 1;
}
x+=dx;
y+=dy;
}
return 0;
}
}
这块是借鉴了leetcode题解中,最简便的一个code
4.总结
-
避免误解题目中没有给出的条件,不要「无中生有」;
-
避免题目中给出的条件被我们忽略,导致简单问题变复杂,这样其实是得不偿失的。