链接
https://leetcode-cn.com/problems/surface-area-of-3d-shapes/
耗时
解题:18 min
题解:16 min
题意
给定一个在 N ∗ N N*N N∗N 的网格,网格上放置有一些单位立方体( 1 ∗ 1 ∗ 1 1 * 1 * 1 1∗1∗1)。网格上的数字 grid[i][j] 代表当前的格子(i,j)上有 grid[i][j] 个立方体。问这些立方体所组成的形体的表面积?
思路
如果没有遮挡,每个格子上的立方体表面积是 4 ∗ g r i d [ i ] [ j ] + 2 4*grid[i][j]+2 4∗grid[i][j]+2。
先计算无遮挡情况下每个格子上立方体的表面积,再减去遮挡面积,即可得出最终表面积。
遮挡面积具体实现:检查当前格子 上、下、左、右 四个方位是否出网格,如果没有则减去遮挡面积(
m
i
n
(
g
r
i
d
[
i
]
[
j
]
,
g
r
i
d
[
x
]
[
y
]
)
min(grid[i][j], grid[x][y])
min(grid[i][j],grid[x][y]))。注意当网格上没有立方体时,按照计算公式仍会得出 2 的表面积,所以需要特判一下直接 continue
。
AC代码
class Solution {
public:
bool check(int x, int y, int n) {
if((x >= 0 && x < n) && (y >= 0 && y < n))
return true;
return false;
}
int surfaceArea(vector<vector<int>>& grid) {
int n = grid.size();
int ans = 0;
int dir[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(grid[i][j] == 0) continue;
ans += 4*grid[i][j]+2;
for(int d = 0; d < 4; ++d) {
int x = i+dir[d][0];
int y = j+dir[d][1];
if(check(x, y, n)) {
ans -= min(grid[i][j], grid[x][y]);
}
}
}
}
return ans;
}
};