← Static tasks

999. Available Captures for Rook

leetcode easy

#csharp#easy#leetcode#matrix#search#string

Task

Вам дана матрица 8 x 8, изображающая шахматную доску. На ней есть ровно одна белая ладья, представленная символом "R", некоторое количество белых слонов "B" и некоторое количество черных пешек "p". Пустые клетки обозначаются символом '.'. Ладья может перемещаться на любое количество клеток по горизонтали или вертикали (вверх, вниз, влево, вправо), пока не достигнет другой фигуры или края доски. Ладья атакует пешку, если она может переместиться на ее клетку за один ход. Примечание: Ладья не может перемещаться через другие фигуры, такие как слоны или пешки. Это означает, что ладья не может атаковать пешку, если путь ей преграждает другая фигура. Верните количество пешек, которые атакует белая ладья.

Пример:

Input: board = [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]

Output: 3

C# solution

matched/original
public 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/original
public 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/original
class 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/original
class 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 0

Go solution

matched/original
func 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" или край доски, остановитесь в этом направлении.

😎