892. 三维形体的表面积

传送门:https://leetcode-cn.com/contest/weekly-contest-99/problems/surface-area-of-3d-shapes/spa

分析:主要注意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;
    }
};