553. Bomb Enemy

Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return the maximum enemies you can kill using one bomb.
The bomb kills all the enemies in the same row and column from the planted point until it hits the wall since the wall is too strong to be destroyed.

Example
Given a grid:

0 E 0 0
E 0 W E
0 E 0 0
return 3. (Placing a bomb at (1,1) kills 3 enemies)

Notice
You can only put the bomb at an empty cell.

public class Solution {
    /**
     * @param grid: Given a 2D grid, each cell is either 'W', 'E' or '0'
     * @return: an integer, the maximum enemies you can kill using one bomb
     */
    public int maxKilledEnemies(char[][] grid) {
        if(grid == null || grid.length == 0) return 0;
        int m = grid.length, n = grid[0].length;
        int[][] res = new int[m][n];
        int[][] f = new int[m][n];
        for(int i = 0;  i< m; i++) {
            for(int j = 0; j < n; j++) {
                res[i][j] = 0;
                f[i][j] = 0;
            }
        }
        //先假设是不是‘E’都可以放炸弹
        for(int i = 0;  i< m; i++) {
            for(int j = 0; j < n; j++) {
                if(grid[i][j] == 'W') {
                    f[i][j] = 0;
                }
                else {
                    f[i][j] = 0; //先初始化
                    if(grid[i][j] == 'E') { 
                        f[i][j] = 1;
                    }
                    if(i > 0) {  // 把上面的加上
                        f[i][j] += f[i-1][j];
                    }
                }
                res[i][j] += f[i][j];
            }
        }
        
        for(int i = m-1; i >= 0; i--) {
            for(int j = 0; j< n; j++) {
                if(grid[i][j] == 'W') {
                    f[i][j] = 0;
                    continue;
                }
                f[i][j] = 0;
                if(grid[i][j] == 'E') { 
                    f[i][j] = 1;
                }
                if(i < m-1) {
                    f[i][j] += f[i+1][j];
                }
                res[i][j] += f[i][j];
            }
        }
        
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                f[i][j] = 0;
                if(grid[i][j] == 'W') {
                    continue;
                }
                if(grid[i][j] == 'E') {
                    f[i][j] = 1;
                }
                if(j > 0) {
                    f[i][j] += f[i][j-1];
                }
                res[i][j] += f[i][j];
            }
        }
        
        for(int i = 0; i < m; i++) {
            for(int j = n-1; j >= 0; j--) {
                f[i][j] = 0;
                if(grid[i][j] == 'W') {
                    continue;
                }
                if(grid[i][j] == 'E') {
                    f[i][j] = 1;
                }
                if(j < n-1) {
                    f[i][j] += f[i][j+1];
                }
                res[i][j] += f[i][j];
            }
        }
        int max_kill = 0;
        for(int i = 0; i  <m; i++) {
            for(int j = 0; j < n; j++) {
                //只有是0的地方才可以放炸弹
                if(grid[i][j] == '0') {
                    max_kill = Math.max(max_kill, res[i][j]);
                }
            }
        }
        return max_kill;
    }
}

猜你喜欢

转载自www.cnblogs.com/lawrenceSeattle/p/10296914.html