题目描述:
题目解释
一开始我不太懂这个题是神马意思,后来明白一个数组就是一行,每行的数字就是这个格子有几个立方体。
现在你可以看看你的小数字键盘。换做这里就是 [ [1,2,3],[4,5,6],[7,8,9] ].
解:
思路: 作减法 每重叠一次,就少两个面
- 两个立方体重起来就少了2个面。仅仅讨论竖起来的重叠方向(好比柱子),那么重叠次数就是个数 - 1。
- 考虑相邻的重叠,按行有重叠现象;按列也有重叠现象。刚好一次循环解决。那么相邻的重叠次数就是当前柱子和前一个柱子中最矮的那个(也就是共有的)。
那么重叠就分为三个部分:垂直(z)、行(x)、列(y)。
正方体总数为total
表面积 = tuaol * 6 - (垂直 + 行 + 列) * 2
package Array;
/**
* 想法:
* 1.从主视图、俯视图、左视图入手,*2 即可得 奈何有空洞的地方,所以有些地方不可用 暂时不采取
* 2.利用重叠来减 因为每重叠一个正方体就会减少两个面 那么就用总的正方体个数 n*6 - 重叠的正方体个数 m*2 注意 正方体中会重复出现重叠,比如我一个正方体与两个正方体发生了重叠。
* 那么就要分别从行和列来考虑重叠的个数
* ps:垂直叠放的重叠也会减少 并且重叠的次数就是正方体个数 - 1
* @author OrangeGirl
*
*/
public class surfaceArea892三维形体的表面积 {
public static void main(String[] args) {
int[][] grid = {{2,2,2},{2,1,2},{2,2,2}};
System.out.println(surfaceArea(grid));
}
public static int surfaceArea(int[][] grid) {
int n = grid.length;
int totalCubes = 0;
int verticalOverlap = 0;
int rowOverlap = 0;
int colOverlap = 0;
//从行列来判断
for(int i = 0;i < n;i++ ) {
for(int j = 0; j < n ;j++) {
totalCubes +=grid[i][j];
if(grid[i][j]>0) {
verticalOverlap += grid[i][j] - 1;//垂直的柱子重叠次数为个数-1
rowOverlap +=j>0? Math.min(grid[i][j], grid[i][j-1]):0;
colOverlap +=i>0? Math.min(grid[i][j], grid[i-1][j]):0;
}
}
}
return totalCubes*6 - (verticalOverlap + rowOverlap + colOverlap)*2;
}
}