在 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
#include <iostream>
#include <vector>
using namespace std;
int surfaceArea(vector<vector<int>>& grid) {
int boxArea = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
if(grid[i][j] != 0)
boxArea += (grid[i][j] * 4 + 2);//计算每个柱体表面积
//从上往下看
if (i != 0)
boxArea -= min(grid[i - 1][j], grid[i][j]);//减去上面与当前重复部分
if (i != grid.size() - 1)
boxArea -= min(grid[i][j], grid[i + 1][j]);//减去下面与当前重复部分
if (j != 0)
boxArea -= min(grid[i][j - 1], grid[i][j]);//减去左边与当前重复部分
if (j != grid[i].size() - 1)
boxArea -= min(grid[i][j], grid[i][j + 1]);//减去右边与当前重复部分
}
}
return boxArea;
}
int main() {
vector<vector<int>> data = { {2,2,2},{2,1,2},{2,2,2} };//测试数据
int result = surfaceArea(data);
cout << result << endl;
return 0;
}