361. 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.
Note: You can only put the bomb at an empty cell.
Example:
Input: [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]
Output: 3
Explanation: For the given grid,
0 E 0 0
E 0 W E
0 E 0 0
Placing a bomb at (1,1) kills 3 enemies.
方法1:
九章:https://www.jiuzhang.com/solution/bomb-enemy/#tag-highlight-lang-cpp
grandyang: http://www.cnblogs.com/grandyang/p/5599289.html
思路:
对每一个位置,用4个矩阵存储该位置上下左右累计有多少个敌人。累计的方法需要考虑墙的位置,也就是说,累计的过程中如果出现了墙,首先该位置要设为0,而其以后的累计都要从零开始
class Solution {
public:
int maxKilledEnemies(vector<vector<char>>& grid) {
if (grid.empty() || grid[0].empty()) return 0;
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> left(m , vector<int> (n, 0)), right = left, up = left, down = left;
// left
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
int t = (j == 0 || grid[i][j] == 'W') ? 0 : left[i][j - 1];
left[i][j] = grid[i][j] == 'E' ? t + 1 : t;
}
}
// right
for (int i = 0; i < m; i ++){
for (int j = n - 1; j >= 0; j--){
int t = (j == n - 1 || grid[i][j] == 'W') ? 0 : right[i][j + 1];
right[i][j] = grid[i][j] == 'E' ? t + 1 : t;
}
}
// up
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
int t = (i == 0 || grid[i][j] == 'W') ? 0 : up[i - 1][j];
up[i][j] = grid[i][j] == 'E' ? t + 1 : t;
}
}
// down
for (int i = m - 1; i >= 0; i--){
for (int j = 0; j < n; j++){
int t = (i == m - 1 || grid[i][j] == 'W') ? 0 : down[i + 1][j];
down[i][j] = grid[i][j] == 'E' ? t + 1 : t;
}
}
// calculate result
int result = 0;
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
if (grid[i][j] == '0'){
result = max(result, left[i][j] + right[i][j] + up[i][j] + down[i][j]);
}
}
}
return result;
}
};
class Solution {
public:
int maxKilledEnemies(vector<vector<char>>& grid) {
if (grid.empty() || grid[0].empty()) return 0;
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> left(m , vector<int> (n, 0)), right = left, up = left, down = left;
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
if (j == 0 || grid[i][j] == 'W'){
left[i][j] = 0;
}
else {
left[i][j] = left[i][j - 1] + (grid[i][j] == 'E');
}
cout << left[i][j] << endl;
}
}
for (int i = 0; i < m; i ++){
for (int j = n - 1; j >= 0; j--){
if (j == n - 1 || grid[i][j] == 'W'){
right[i][j] = 0;
}
else {
right[i][j] = right[i][j + 1] + (grid[i][j] == 'E');
}
}
}
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
if (i == 0 || grid[i][j] == 'W'){
up[i][j] = 0;
}
else {
up[i][j] = up[i - 1][j] + (grid[i][j] == 'E');
}
}
}
for (int i = m - 1; i >= 0; i--){
for (int j = 0; j < n; j++){
if (i == m - 1 || grid[i][j] == 'W'){
down[i][j] = 0;
}
else {
down[i][j] = down[i + 1][j] + (grid[i][j] == 'E');
}
}
}
//
int result = 0;
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j++){
if (grid[i][j] == '0'){
result = max(result, left[i][j] + right[i][j] + up[i][j] + down[i][j]);
}
}
}
return result;
}
};