House Building(几何体表面积)360笔试/2019.08.15

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值