2020 360校招 求立方体表面积
将长为n*m的矩形划分为n行m列(每行列宽度均为1),在第i行j列 A(i,j)位置上放边长为1的正方体( 1<=A(i,j)<=100),所有正方体组成一个立方体。
- 每个正方体的六个面中的一部分会被其他部分正方体遮挡,未被遮挡的部分总面积即为该立方体的表面积,求表面积大小?
- 输入:
- 第一行两个正整数 N 和M, 1<= n, M<= 1000;
- 输出:
- 表面积大小
- 示例输入:
- 2 2
2 1
1 1
输出: 20
原理是单独计算每一层的表面积,再求和
推导过程是:
1.
总表面积 = 第一层表面积 + 第二层 + ......+顶层表面积
2.
第一层表面积 = 四周所占面积(2*(m+n))+上下所占面积(2*m*n - 第二层正方体个数)
第二层表面积 = 四周所占面积(第二层周长) + 上下所占面积(第二层个数 - 第三层个数)
第三层表面积 = 四周所占面积(第三层周长) + 上下所占面积(第三层个数 - 第四层个数)
依次后推。。。
顶层面积 = 四周所占面积(顶层周长) + 上下所占面积(顶层个数)
3.
将2中推导过程相加,上下面积全部相互抵消,得到结果
总表面积 = 2*(m+n)+2*m*n + 第二层周长 + 第三层周长 + ......+顶层周长
…
### 实现代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] arr = new int[n][m];
for(int i=0 ; i< n; i++){
for(int j=0 ;j<m; j++){
arr[i][j] = sc.nextInt();
}
}
int[][] temp = new int[n][m];
//int num=0;
int sum = 0;
boolean sign = true;
while(sign){
for(int i=0 ; i< n; i++){
for(int j=0 ;j<m; j++){
arr[i][j] = arr[i][j]-1 > 0 ? arr[i][j]-1:0;
//sum += temp[i][j];
temp[i][j] = arr[i][j] > 0 ? 1:0;//用来计算每一层的周长
//if(arr[i][j] > 0){ num++;}//每一层个数
}
}
sum += islandPerimeter(temp);//计算每一层周长
if(islandPerimeter(temp) == 0){sign =false;}//最后一层,停止循环
}
System.out.println(2*(m+n)+2*m*n+sum);
}
// 计算每一层周长
public static int islandPerimeter(int[][] grid) {
//System.out.println("dd");
int count = 0;
for(int i = 0;i<grid.length;i++){
for(int j = 0;j<grid[i].length;j++){
if(grid[i][j] == 1){
if(i - 1 < 0 || grid[i - 1][j] == 0){
count ++;
}
if(i + 1 >= grid.length || grid[i+1][j] == 0){
count ++;
}
if(j -1 <0 || grid[i][j - 1] == 0){
count ++;
}
if(j + 1 >= grid[i].length || grid[i][j + 1] == 0){
count ++;
}
}
}
}
return count;
}
测试结果