Leetcode每日一题(999. 车的可用捕获量)

999. 车的可用捕获量

题目:

在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。

车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。

返回车能够在一次移动中捕获到的卒的数量。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/available-captures-for-rook
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.分析
  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.总结
  • 避免误解题目中没有给出的条件,不要「无中生有」;

  • 避免题目中给出的条件被我们忽略,导致简单问题变复杂,这样其实是得不偿失的。

发布了9 篇原创文章 · 获赞 3 · 访问量 441

猜你喜欢

转载自blog.csdn.net/qq_41740808/article/details/105121926