361. Bomb Enemy

Task text is translated from Russian for the selected interface language. Code is left unchanged.

Дана матрица размером m x n, где каждая ячейка является либо стеной 'W', либо врагом 'E', либо пустой '0'. return максимальное количество врагов, которых можно уничтожить, используя одну бомбу. Вы можете разместить бомбу только в пустой ячейке.

Бомба уничтожает всех врагов в той же строке и столбце от точки установки до тех пор, пока не встретит стену, так как она слишком сильна, чтобы быть разрушенной.

Example:

Input: grid = [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]

Output: 3

C# solution

matched/original
public class Solution {
    public int MaxKilledEnemies(char[][] grid) {
        if (grid.Length == 0) return 0;
        int rows = grid.Length;
        int cols = grid[0].Length;
        int maxCount = 0;
        for (int row = 0; row < rows; ++row) {
            for (int col = 0; col < cols; ++col) {
                if (grid[row][col] == '0') {
                    int hits = KillEnemies(row, col, grid);
                    maxCount = Math.Max(maxCount, hits);
                }
            }
        }
        return maxCount;
    }
    private int KillEnemies(int row, int col, char[][] grid) {
        int enemyCount = 0;
        int[][] directions = new int[][] {
            new int[] {-1, 0}, new int[] {1, 0}, 
            new int[] {0, -1}, new int[] {0, 1}
        };
        foreach (var dir in directions) {
            int r = row + dir[0];
            int c = col + dir[1];
            
            while (r >= 0 && r < grid.Length && c >= 0 && c < grid[0].Length) {
                if (grid[r][c] == 'W') break;
                if (grid[r][c] == 'E') ++enemyCount;
                r += dir[0];
                c += dir[1];
            }
        }
        return enemyCount;
    }
}

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 MaxKilledEnemies(char[][] grid) {
        if (grid.size() == 0) return 0;
        int rows = grid.size();
        int cols = grid[0].size();
        int maxCount = 0;
        for (int row = 0; row < rows; ++row) {
            for (int col = 0; col < cols; ++col) {
                if (grid[row][col] == '0') {
                    int hits = KillEnemies(row, col, grid);
                    maxCount = max(maxCount, hits);
                }
            }
        }
        return maxCount;
    }
    private int KillEnemies(int row, int col, char[][] grid) {
        int enemyCount = 0;
        int[][] directions = new int[][] {
            new int[] {-1, 0}, new int[] {1, 0}, 
            new int[] {0, -1}, new int[] {0, 1}
        };
        foreach (var dir in directions) {
            int r = row + dir[0];
            int c = col + dir[1];
            
            while (r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size()) {
                if (grid[r][c] == 'W') break;
                if (grid[r][c] == 'E') ++enemyCount;
                r += dir[0];
                c += dir[1];
            }
        }
        return enemyCount;
    }
}

Java solution

matched/original
class Solution {
    public int maxKilledEnemies(char[][] grid) {
        if (grid.length == 0)
            return 0;

        int rows = grid.length;
        int cols = grid[0].length;

        int maxCount = 0;

        for (int row = 0; row < rows; ++ row) {
            for (int col = 0; col < cols; ++ col) {
                if (grid[row][col] == '0') {
                    int hits = this.killEnemies(row, col, grid);
                    maxCount = Math.max(maxCount, hits);
                }
            }
        }

        return maxCount;
    }

    private int killEnemies(int row, int col, char[][] grid) {
        int enemyCount = 0;
        for (int c = col - 1; c >= 0; --c) {
            if (grid[row][c] == 'W')
                break;
            else if (grid[row][c] == 'E')
                enemyCount += 1;
        }

        for (int c = col + 1; c < grid[0].length; ++c) {
            if (grid[row][c] == 'W')
                break;
            else if (grid[row][c] == 'E')
                enemyCount += 1;
        }

        for (int r = row - 1; r >= 0; --r) {
            if (grid[r][col] == 'W')
                break;
            else if (grid[r][col] == 'E')
                enemyCount += 1;
        }

        for (int r = row + 1; r < grid.length; ++r) {
            if (grid[r][col] == 'W')
                break;
            else if (grid[r][col] == 'E')
                enemyCount += 1;
        }

        return enemyCount;
    }
}

Python solution

matched/original
class Solution:
    def maxKilledEnemies(self, grid):
        if not grid:
            return 0

        rows, cols = len(grid), len(grid[0])
        max_count = 0

        for row in range(rows):
            for col in range(cols):
                if grid[row][col] == '0':
                    hits = self.killEnemies(row, col, grid)
                    max_count = max(max_count, hits)

        return max_count

    def killEnemies(self, row, col, grid):
        enemy_count = 0
        directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        
        for dr, dc in directions:
            r, c = row + dr, col + dc
            
            while 0 <= r < len(grid) and 0 <= c < len(grid[0]):
                if grid[r][c] == 'W':
                    break
                elif grid[r][c] == 'E':
                    enemy_count += 1
                r += dr
                c += dc

        return enemy_count

Go solution

matched/original
package main

import "fmt"

type Solution struct{}

func (s *Solution) maxKilledEnemies(grid [][]byte) int {
    if len(grid) == 0 {
        return 0
    }

    rows := len(grid)
    cols := len(grid[0])
    maxCount := 0

    for row := 0; row < rows; row++ {
        for col := 0; col < cols; col++ {
            if grid[row][col] == '0' {
                hits := s.killEnemies(row, col, grid)
                if hits > maxCount {
                    maxCount = hits
                }
            }
        }
    }

    return maxCount
}

func (s *Solution) killEnemies(row, col int, grid [][]byte) int {
    enemyCount := 0
    directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

    for _, dir := range directions {
        r, c := row+dir[0], col+dir[1]

        for r >= 0 && r < len(grid) && c >= 0 && c < len(grid[0]) {
            if grid[r][c] == 'W' {
                break
            }
            if grid[r][c] == 'E' {
                enemyCount++
            }
            r += dir[0]
            c += dir[1]
        }
    }

    return enemyCount
}

func main() {
    grid := [][]byte{
        {'0', 'E', '0', '0'},
        {'E', '0', 'W', 'E'},
        {'0', 'E', '0', '0'},
    }

    sol := Solution{}
    fmt.Println(sol.maxKilledEnemies(grid)) 
}

Algorithm

Перебрать каждую ячейку в сетке и для каждой пустой ячейки вычислить, сколько врагов можно убить, установив бомбу.

Реализовать функцию killEnemies(row, col), которая считает количество врагов, убитых бомбой, установленных в пустой ячейке (row, col), проверяя все четыре направления (влево, вправо, вверх, вниз) до стены или границы сетки.

Вернуть максимальное количество врагов, убитых среди всех пустых ячеек.

😎

Vacancies for this task

Active vacancies with overlapping task tags are shown.

All vacancies
There are no active vacancies yet.