说实在的,看了半天硬是没看懂题意,看了一下评论后,恍然大悟,看来还是我天资愚钝啊qwq
这里先复制一下题目
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
输入:[[2]]
输出:10
输入:[[1,2],[3,4]]
输出:34
这里解释一下:根据第一个输入输出来说明吧,在(0,0)这个坐标上有2个方块,所以暴露的表面积就为10;
然后就是第二个输入输出,在(0,0)有1个方块,(0,1)有2个方块,(1,1)有3个方块,(1,2)有4个方块,
好了接下来就是怎么算表面积了;
首先我的想法是:先上下左右遍历看周围是否有方块,如果有,就减去周围方块的个数,如果周围方块数高于你的数量,则为0;
还有一点需要注意的是,每个坐标如果有方块数量,那么它的表面积最少就是2。
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int n = grid.size();
int sum = 0;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]>0){//如果大于0则顶部和底部会贡献2个表面积
sum+=2;
}
for(int k=0;k<4;k++){//开始向四周遍历
int x=i+dx[k];
int y=j+dy[k];
int vis = 0;
if(x>=0&&x<n&&y>=0&&y<n){//如果没有越界
vis = grid[x][y];
}
sum+=max(grid[i][j]-vis,0);//看是否有暴露的侧面积
}
}
}
return sum;
}
};