三维形体的表面积

在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体。

每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

请你返回最终形体的表面积。

 

示例 1:

输入:[[2]] // 表示在grid[0][0]的位置有2个正方体
输出:10
示例 2:

输入:[[1,2],[3,4]] // 表示在grid[0][0]的位置有1个正方体,在grid[0][1]的位置有2个正方体,在grid[1][0]的位置有3个正方体在grid[1][1]的位置有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

 

class Solution {
public:
    int surfaceArea(vector<vector<int>>& grid) {
        int num = 0;
        int numContact = 0;
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[i].size(); j++){
                num += grid[i][j];
                if(grid[i][j] != 0) numContact += grid[i][j]-1;
                if(i != 0){
                    numContact += min(grid[i-1][j],grid[i][j]);
                }
                if(j != 0){
                    numContact += min(grid[i][j-1], grid[i][j]);
                }
            }
        }

        return num*6 - numContact*2;
    }
};

解题思路:每个正方体的面有6个,每接触1下,就会消耗2个面。因此只要计算出有多少个正方体,以及有多少个面有接触就好了。

其中接触面有两种情况:(1)同一个位置堆叠起来的正方体,其消耗的面个数为grid[i][j]-1(2)与左边或上边的立方体接触,消耗的面个数为两者的立方体个数最小值。

 

posted @ 2020-03-25 20:01  jenningszheng  阅读(223)  评论(0编辑  收藏  举报