On an 8 x 8 chessboard, there is one white rook.  There also may be empty squares, white bishops, and black pawns.  These are given as characters 'R', '.', 'B', and 'p' respectively. Uppercase characters represent white pieces, and lowercase characters represent black pieces.

The rook moves as in the rules of Chess: it chooses one of four cardinal directions (north, east, west, and south), then moves in that direction until it chooses to stop, reaches the edge of the board, or captures an opposite colored pawn by moving to the same square it occupies.  Also, rooks cannot move into the same square as other friendly bishops.

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

Return the number of pawns the rook can capture in one move.

 

Example 1:

Available Captures for Rook LT999 随笔 第1张

Input: [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 3 Explanation:  In this example the rook is able to capture all the pawns. 

Example 2:

Available Captures for Rook LT999 随笔 第2张

Input: [[".",".",".",".",".",".",".","."],[".","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",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 0 Explanation:  Bishops are blocking the rook to capture any pawn. 

Example 3:

Available Captures for Rook LT999 随笔 第3张

Input: [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 3 Explanation:  The rook can capture the pawns at positions b5, d6 and f5.

Note:

    1. board.length == board[i].length == 8
    2. board[i][j] is either 'R''.''B', or 'p'
    3. There is exactly one cell with board[i][j] == 'R'

 Idea 1. walking 4 directions until eaither hit the edge or 'B' or 'p'.

Time complexity: O(2n), here n = 8

Space complexity: O(1)

 1 class Solution {
 2     private int walking(char[][] board, int x, int y) {
 3         int N = 8;
 4         int[][] dirs = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
 5         
 6         int count = 0;
 7         for(int[] dir: dirs) {
 8             for(int nextX = x + dir[0], nextY = y + dir[1];
 9                 nextX >= 0 && nextX < N && nextY >= 0 && nextY < N
10                 && board[nextX][nextY] != 'B';
11                 nextX += dir[0], nextY += dir[1]) { 
12                 if(board[nextX][nextY] == 'p') {
13                     ++count;
14                     break;
15                 } 
16             }
17             
18         }
19         return count;
20     }
21     
22     public int numRookCaptures(char[][] board) {
23         for(int i = 0; i < board.length; ++i) {
24             for(int j = 0; j < board[i].length; ++j) {
25                 if(board[i][j] == 'R') {
26                     return walking(board, i, j);
27                 }
28             }
29         }
30         
31         return 0;
32     }
33 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄