炸彈襲擊 - LintCode

描述
給一個二維矩陣, 每一個格子都可能是一堵牆 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章