描述
給一個二維矩陣, 每一個格子都可能是一堵牆 W, 一個敵人 E 或者空 0 (數字 ‘0’), 返回你可以用一個炸彈殺死的最大敵人數. 炸彈會殺死所有在同一行和同一列沒有牆阻隔的敵人, 因爲牆比較堅固難以摧毀.
你只能在空的地方放置炸彈.
樣例
給一個矩陣:
0 E 0 0
E 0 W E
0 E 0 0
返回 3.(在(1, 1)處放炸彈可以殺死 3 個敵人)
思路
分別計算四個方向的殺死敵人的數目,最終返回最大值。
#ifndef C553_H
#define C553_H
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class Solution {
public:
/**
* @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
*/
int maxKilledEnemies(vector<vector<char>> &grid) {
// write your code here
if (grid.empty() || grid[0].empty())
return 0;
int rows = grid.size();
int cols = grid[0].size();
//up[i][j],down[i][j],left[i][j],right[i][j]分別表示grid[i-1][j-1]上下左右四個方向上可以殺死的敵人數
vector<vector<int>>
left(rows + 2, vector<int>(cols + 2, 0)),
right(rows + 2, vector<int>(cols + 2, 0)),
up(rows + 2, vector<int>(cols + 2, 0)),
down(rows + 2, vector<int>(cols + 2, 0));
//left[i][j]表示在grid[i-1][j-1]放置炸彈,向左可以殺死的最大敵人數
//假設E也可以放置炸彈,當前元素爲E,可以殺死的敵人數加一
//當前元素爲W,不能放置炸彈,可以殺死的人數爲0
//當前元素爲0,可以殺死的人數不變
for (int i = 1; i <= rows; ++i)
{
for (int j = 1; j <= cols; ++j)
{
if (grid[i - 1][j - 1] == 'E')
left[i][j] = left[i][j - 1] + 1;
else if (grid[i - 1][j - 1] == 'W')
left[i][j] = 0;
else
left[i][j] = left[i][j - 1];
}
}
//right[i][j]表示在grid[i - 1][j - 1]放置炸彈, 向右可以殺死的最大敵人數
for (int i = 1; i <= rows; ++i)
{
for (int j = cols; j >= 1; --j)
{
if (grid[i - 1][j - 1] == 'E')
right[i][j] = right[i][j + 1] + 1;
else if (grid[i - 1][j - 1] == 'W')
right[i][j] = 0;
else
right[i][j] = right[i][j + 1];
}
}
//up[i][j]表示在grid[i-1][j-1]放置炸彈,向上可以殺死的最大敵人數
for (int j = 1; j <= cols; ++j)
{
for (int i = 1; i <= rows; ++i)
{
if (grid[i - 1][j - 1] == 'E')
up[i][j] = up[i-1][j] + 1;
else if (grid[i - 1][j - 1] == 'W')
up[i][j] = 0;
else
up[i][j] = up[i - 1][j];
}
}
//down[i][j]表示在grid[i-1][j-1]放置炸彈,向下可以殺死的最大敵人數
for (int j = 1; j <= cols; ++j)
{
for (int i = rows; i >= 1; --i)
{
if (grid[i - 1][j - 1] == 'E')
down[i][j] = down[i + 1][j] + 1;
else if (grid[i - 1][j - 1] == 'W')
down[i][j] = 0;
else
down[i][j] = down[i + 1][j];
}
}
int res = 0;
//僅在grid[i-1][j-1]爲0時計算其上下左右可以殺死敵人的總數
for (int i = 1; i <= rows; ++i)
{
for (int j = 1; j <= cols; ++j)
{
if (grid[i - 1][j - 1] == '0')
{
res = max(res, left[i][j] + right[i][j] + up[i][j] + down[i][j]);
}
}
}
return res;
}
};
#endif