传送门:https://leetcode-cn.com/contest/weekly-contest-99/problems/surface-area-of-3d-shapes/
分析:主要注意v = 0时引起周边表面积的变化
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int area = 0;
//up/down
for(int i = 0; i < grid.size(); i++) {
for(int j = 0; j < grid[0].size(); j++) {
if(grid[i][j] > 0) area += 2; //v为0的没有表面积
}
}
// cout << area << '\n';
//left/right
for(int j = 0; j < grid[0].size(); j++) {
for(int i = 0; i < grid.size(); i++) {
if(grid[i][j]) {
if(i == 0 || grid[i-1][j] == 0) //最左边或左边为空
area += grid[i][j];
else area += abs(grid[i-1][j]-grid[i][j]); //相邻面积之差
}
else if(i && grid[i-1][j]) //当前为0但前左边一个不为0
area += grid[i-1][j];
}
if(grid[grid.size()-1][j]) area += grid[grid.size()-1][j]; //最右边的侧面
}
// cout << area << '\n';
//front/back
for(int i = 0; i < grid.size(); i++) {
for(int j = 0; j < grid[0].size(); j++) {
if(grid[i][j]) {
if(j == 0 || grid[i][j-1] == 0) //最前边或前边为空
area += grid[i][j];
else area += abs(grid[i][j-1]-grid[i][j]); //相邻面积之差
}
else if(j && grid[i][j-1]) //当前为0但前一个不为0
area += grid[i][j-1];
}
if(grid[i][grid[0].size()-1]) area += grid[i][grid[0].size()-1]; //最后边的侧面
}
// cout << area << '\n';
return area;
}
};