1. 程式人生 > >【Leetcode】892. 三維形體的表面積

【Leetcode】892. 三維形體的表面積

題目描述:

在 N * N 的網格上,我們放置一些 1 * 1 * 1  的立方體。

每個值 v = grid[i][j] 表示 v 個正方體疊放在單元格 (i, j) 上。

返回結果形體的總表面積。

示例 1:

輸入:[[2]]
輸出:10

示例 2:

輸入:[[1,2],[3,4]]
輸出:34

示例 3:

輸入:[[1,0],[0,2]]
輸出:16

示例 4:

輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:32

示例 5:

輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:46

提示:

  • 1 <= N <= 50
  • 0 <= grid[i][j] <= 50

解題思路:

之前做過【883.三維投影面積】,本來以為x2就好了,但是事情並沒那麼簡單(^_^)。因為投影會有遮擋部分的表面積不計算,所以使用投影的方法行不通了,那就只能一個一個的去統計了。這時,我們就會發現:

表面積=每個立方體面積-接觸面面積=立方體個數*6-接觸面個數*2;

這樣的話,我們就只用分別統計小立方體個數和接觸的個數了。

AC程式碼:

class Solution {
public:
    int surfaceArea(vector<vector<int>>& grid)
    {
        int count = 0;
        int contact = 0;
        for (int i = 0; i < grid.size(); i++)
        {
            for (int j = 0; j < grid[0].size(); j++)
            {
                //Total number of cubes
                count += grid[i][j];

                //button contact areas number
                if (grid[i][j] > 1)
                {
                    contact += grid[i][j] - 1;
                }

                //right contact areas number
                if ((j < (grid[0].size() - 1)) && (grid[i][j + 1] != 0))
                {
                    contact += min(grid[i][j + 1], grid[i][j]);
                }

                //font contact areas number
                if ((i < (grid.size() - 1)) && (grid[i + 1][j] != 0))
                {
                    contact += min(grid[i + 1][j], grid[i][j]);
                }

            }
        }
        return count * 6 - contact * 2;
    }
};