999. Available Captures for Rook
leetcode easy
Task
Вам дана матрица 8 x 8, изображающая шахматную доску. На ней есть ровно одна белая ладья, представленная символом "R", некоторое количество белых слонов "B" и некоторое количество черных пешек "p". Пустые клетки обозначаются символом '.'. Ладья может перемещаться на любое количество клеток по горизонтали или вертикали (вверх, вниз, влево, вправо), пока не достигнет другой фигуры или края доски. Ладья атакует пешку, если она может переместиться на ее клетку за один ход. Примечание: Ладья не может перемещаться через другие фигуры, такие как слоны или пешки. Это означает, что ладья не может атаковать пешку, если путь ей преграждает другая фигура. Верните количество пешек, которые атакует белая ладья.
Пример:
Input: board = [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 3
C# solution
matched/originalpublic class Solution {
public int NumRookCaptures(char[][] board) {
int CountPawns(int x, int y, int dx, int dy) {
while (x >= 0 && x < 8 && y >= 0 && y < 8) {
if (board[x][y] == 'B') break;
if (board[x][y] == 'p') return 1;
x += dx;
y += dy;
}
return 0;
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i][j] == 'R') {
return CountPawns(i, j, -1, 0) + CountPawns(i, j, 1, 0) +
CountPawns(i, j, 0, -1) + CountPawns(i, j, 0, 1);
}
}
}
return 0;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int NumRookCaptures(char[][] board) {
int CountPawns(int x, int y, int dx, int dy) {
while (x >= 0 && x < 8 && y >= 0 && y < 8) {
if (board[x][y] == 'B') break;
if (board[x][y] == 'p') return 1;
x += dx;
y += dy;
}
return 0;
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i][j] == 'R') {
return CountPawns(i, j, -1, 0) + CountPawns(i, j, 1, 0) +
CountPawns(i, j, 0, -1) + CountPawns(i, j, 0, 1);
}
}
}
return 0;
}
}Java solution
matched/originalpublic class Solution {
public int numRookCaptures(char[][] board) {
int countPawns(int x, int y, int dx, int dy) {
while (x >= 0 && x < 8 && y >= 0 && y < 8) {
if (board[x][y] == 'B') break;
if (board[x][y] == 'p') return 1;
x += dx;
y += dy;
}
return 0;
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i][j] == 'R') {
return countPawns(i, j, -1, 0) + countPawns(i, j, 1, 0) +
countPawns(i, j, 0, -1) + countPawns(i, j, 0, 1);
}
}
}
return 0;
}
}JavaScript solution
matched/originalclass Solution {
numRookCaptures(board) {
const countPawns = (x, y, dx, dy) => {
while (x >= 0 && x < 8 && y >= 0 && y < 8) {
if (board[x][y] === 'B') break;
if (board[x][y] === 'p') return 1;
x += dx;
y += dy;
}
return 0;
};
for (let i = 0; i < 8; i++) {
for (let j = 0; j < 8; j++) {
if (board[i][j] === 'R') {
return countPawns(i, j, -1, 0) + countPawns(i, j, 1, 0) +
countPawns(i, j, 0, -1) + countPawns(i, j, 0, 1);
}
}
}
return 0;
}
}Python solution
matched/originalclass Solution:
def numRookCaptures(self, board: List[List[str]]) -> int:
def count_pawns(x, y, dx, dy):
while 0 <= x < 8 and 0 <= y < 8:
if board[x][y] == 'B':
break
if board[x][y] == 'p':
return 1
x, y = x + dx, y + dy
return 0
for i in range(8):
for j in range(8):
if board[i][j] == 'R':
return (count_pawns(i, j, -1, 0) + count_pawns(i, j, 1, 0) +
count_pawns(i, j, 0, -1) + count_pawns(i, j, 0, 1))
return 0Go solution
matched/originalfunc numRookCaptures(board [][]byte) int {
countPawns := func(x, y, dx, dy int) int {
for x >= 0 && x < 8 && y >= 0 && y < 8 {
if board[x][y] == 'B' {
break
}
if board[x][y] == 'p' {
return 1
}
x += dx
y += dy
}
return 0
}
for i := 0; i < 8; i++ {
for j := 0; j < 8; j++ {
if board[i][j] == 'R' {
return countPawns(i, j, -1, 0) + countPawns(i, j, 1, 0) +
countPawns(i, j, 0, -1) + countPawns(i, j, 0, 1)
}
}
}
return 0
}Explanation
Algorithm
Поиск ладьи:
Найдите координаты белой ладьи "R" на шахматной доске.
Проверка направлений атаки:
Проверьте все четыре направления (влево, вправо, вверх, вниз) от позиции ладьи.
Перемещайтесь по каждому направлению до тех пор, пока не встретите другую фигуру или край доски.
Подсчет атакованных пешек:
Если встреченная фигура - черная пешка "p", увеличьте счетчик атакованных пешек.
Если встреченная фигура - белый слон "B" или край доски, остановитесь в этом направлении.
😎