题目描述:
在 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;
}
};