在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
示例 3:
输入:[[1,0],[0,2]]
输出:16
示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package leetCodeTest;
public class 三维形体的表面积 {
public static void main(String[] args) {
int[][] grid = new int[][]{{1,0},{0,2}};
int i = surfaceArea(grid);
System.out.println("i = " + i);
}
/**
* 首先计算出当前柱体的总面积(不考虑与周围柱体之间的重叠),
* 然后以当前柱体为中心计算右侧与上侧的重叠面积,使用总面积减去此面积,
* 按照这种方式遍历NxN网格的所有位置。由于遍历时从最左上角开始,
* 所以最终计算的重叠面积是包含所有柱体的重叠面积(即不会重复计算两次同一处的重叠)。
* 按这种思路计算最终得到的结果即为最终面积。
* @param grid
* @return
*/
public static int surfaceArea(int[][] grid) {
int i,j;
int count=0;
for (i=0;i<grid.length;i++){
for (j=0;j<grid[i].length;j++){
if (grid[i][j] != 0){
count += (grid[i][j]-1)*4 + 6;
int res = find(i, j, grid);
count -= res;
}
}
}
return count;
}
public static int find(int i,int j,int[][] grid){
if (grid[i][j] == 0)
return 0;
int count = 0;
if (i-1 >=0 && grid[i-1][j] != 0)
count += Math.min(grid[i][j], grid[i-1][j])*2;
if (j - 1 >= 0 && grid[i][j-1] != 0)
count += Math.min(grid[i][j],grid[i][j-1])*2;
return count;
}
}