Output
Sample Input
2 3 3 1 0 0 3 1 2 1 1 0 3 3 1 0 1 0 0 0 1 0 1
Sample Output
30 20
分析:
首先计算出有多少个立方体,乘以6以后减去被遮盖的面的面积;有三种
1.底面的不计算;
2.上下的遮盖;
3.前后左右的覆盖;
1 2都很好解决,3用两次二维循环,判断连续的两个位置是否都不是零,如果都不是,那么被覆盖的面一定是盖度较低的*2;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] a = new int[n + 1][m + 1];
int ans = 0;
int cnt = 0;
int dnf = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = sc.nextInt();
ans += a[i][j];// 计算总立方体个数
if (a[i][j] != 0)
cnt++;// 计算底面的面积
if (a[i][j] > 1)
dnf = dnf + a[i][j] - 1;// 计算上下面的遮盖数(*2)
}
}
ans = ans * 6 - cnt;
//前后关系
for (int i = 1; i <= m; i++)
for (int j = 1; j < n; j++)
if ((a[j][i] != 0) && (a[j + 1][i] != 0))
dnf += Math.min(a[j][i], a[j + 1][i]);
//左右关系
for (int i = 1; i <= n; i++)
for (int j = 1; j < m; j++)
if ((a[i][j] != 0) && (a[i][j + 1] != 0))
dnf += Math.min(a[i][j], a[i][j + 1]);
ans = ans - dnf * 2;
System.out.println(ans);
}
}
示例一
输入
3 3
1 0 0
3 1 2
1 1 0
输出
30
示例二
输入
3 3
1 0 1
0 0 0
1 0 1
输出
20