定一个二维矩阵, 每一个格子可能是一堵墙 W,或者 一个敌人 E 或者空 0 (数字 ‘0’), 返回你可以用一个炸弹杀死的最大敌人数. 炸弹会杀死所有在同一行和同一列没有墙阻隔的敌人。 由于墙比较坚固,所以墙不会被摧毁.
思路:爆炸会分为四个方向,因此我们可以将四个方向的杀敌数目都给求出来。当我们遇到墙的时候,因为无法穿透,所以这个位置可以杀死的敌人计为 0,同时不用再加上上一个的位置,一位墙过不去。遇到的位置如果是空位,我们就先将当前的位置计为 0,然后加上前面位置的数字, 遇到敌人的话就将当前的位置计为 1(因为这个位置的敌人也会被消灭,所以加上 1 ),然后加上气脉你位置的信息。
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) {
// write your code here
if(grid == null || grid.length == 0 || grid[0].length == 0) return 0;
int row = grid.length;
int col = grid[0].length;
int[][] up = new int[row][col];
int[][] down = new int[row][col];
int[][] left = new int[row][col];
int[][] right = new int[row][col];
int i, j;
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
if(grid[i][j] == 'W'){
up[i][j] = 0;
continue;
}
up[i][j] = grid[i][j] == 'E' ? 1 : 0;
if(i > 0){
up[i][j] += up[i - 1][j];
}
}
}
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
if(grid[i][j] == 'W'){
left[i][j] = 0;
continue;
}
left[i][j] = grid[i][j] == 'E' ? 1 : 0;
if(j > 0){
left[i][j] += left[i][j - 1];
}
}
}
for(i = row - 1; i >= 0; i--){
for(j = 0; j < col; j++){
if(grid[i][j] == 'W'){
down[i][j] = 0;
continue;
}
down[i][j] = grid[i][j] == 'E' ? 1 : 0;
if(i < row - 1){
down[i][j] += down[i + 1][j];
}
}
}
for(i = 0; i < row; i++){
for(j = col - 1; j >= 0; j--){
if(grid[i][j] == 'W'){
right[i][j] = 0;
continue;
}
right[i][j] = grid[i][j] == 'E' ? 1 : 0;
if(j < col - 1){
right[i][j] += right[i][j + 1];
}
}
}
int res = 0;
int sum = 0;
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
if(grid[i][j] == '0'){
sum = up[i][j] + down[i][j] + left[i][j] + right[i][j];
}
res = Math.max(res, sum);
}
}
return res;
}
}