Locate the rook, scan each cardinal ray, stop at the first nonempty square, and count it only when it holds a pawn.
Complexity
O(rows * columns) time and O(1) space.
Count pawns an unmoving rook can capture along the four board directions before a bishop blocks it.
Locate the rook, scan each cardinal ray, stop at the first nonempty square, and count it only when it holds a pawn.
O(rows * columns) time and O(1) space.
package main
func numRookCaptures(board [][]byte) int {
rookRow, rookColumn := 0, 0
for row := 0; row < 8; row++ {
for column := 0; column < 8; column++ {
if board[row][column] == 'R' {
rookRow, rookColumn = row, column
}
}
}
captures := 0
directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
for _, direction := range directions {
row, column := rookRow+direction[0], rookColumn+direction[1]
for row >= 0 && row < 8 && column >= 0 && column < 8 && board[row][column] == '.' {
row += direction[0]
column += direction[1]
}
if row >= 0 && row < 8 && column >= 0 && column < 8 && board[row][column] == 'p' {
captures++
}
}
return captures
}
class Solution:
def numRookCaptures(self, board: list[list[str]]) -> int:
rook = next((row, column) for row in range(8) for column in range(8) if board[row][column] == "R")
captures = 0
for dr, dc in ((-1, 0), (1, 0), (0, -1), (0, 1)):
row, column = rook[0] + dr, rook[1] + dc
while 0 <= row < 8 and 0 <= column < 8 and board[row][column] == ".": row, column = row + dr, column + dc
if 0 <= row < 8 and 0 <= column < 8 and board[row][column] == "p": captures += 1
return captures
function numRookCaptures(board: string[][]): number {
let rookRow = 0; let rookColumn = 0;
for (let row = 0; row < 8; row += 1) for (let column = 0; column < 8; column += 1) if (board[row][column] === "R") { rookRow = row; rookColumn = column; }
let captures = 0;
for (const [dr, dc] of [[-1, 0], [1, 0], [0, -1], [0, 1]]) { let row = rookRow + dr; let column = rookColumn + dc; while (row >= 0 && row < 8 && column >= 0 && column < 8 && board[row][column] === ".") { row += dr; column += dc; } if (row >= 0 && row < 8 && column >= 0 && column < 8 && board[row][column] === "p") captures += 1; }
return captures;
}