# 892. Surface Area of 3D Shapes (Easy)

https://leetcode.com/problems/surface-area-of-3d-shapes/

On a `N * N` grid, we place some `1 * 1 * 1 `cubes.

Each value `v = grid[i][j]` represents a tower of `v` cubes placed on top of grid cell `(i, j)`.

Return the total surface area of the resulting shapes.

Example 1:

```Input: [[2]]
Output: 10
```

Example 2:

```Input: [[1,2],[3,4]]
Output: 34
```

Example 3:

```Input: [[1,0],[0,2]]
Output: 16
```

Example 4:

```Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 32
```

Example 5:

```Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 46
```

Note:

• `1 <= N <= 50`
• `0 <= grid[i][j] <= 50`

## Solutions

``````class Solution {
public int surfaceArea(int[][] grid) {
int[] dr = new int[]{0, 1, 0, -1};
int[] dc = new int[]{1, 0, -1, 0};

int N = grid.length;
int ans = 0;

for (int r = 0; r < N; ++r) {
for (int c = 0; c < N; ++c) {
if (grid[r][c] <= 0) {
continue;
}

// at least two facets will not be covered by other cubes
// they are respectively the bottom most and the top most facets
ans += 2;

// check four horizontal directions
for (int k = 0; k < 4; ++k) {
int nr = r + dr[k];
int nc = c + dc[k];

int nv = 0;

// verify whether coordinate is valid
if (0 <= nr && nr < N && 0 <= nc && nc < N) {
nv = grid[nr][nc];
}

// if height of neighbor cube tower is equal or higher than current one
// all the facets on corresponding direction are all blocked out.
ans += Math.max(grid[r][c] - nv, 0);
}
}

}

return ans;
}
}
``````