360校招 求立方体表面积

2020 360校招 求立方体表面积

在这里插入图片描述
将长为n*m的矩形划分为n行m列(每行列宽度均为1),在第i行j列 A(i,j)位置上放边长为1的正方体( 1<=A(i,j)<=100),所有正方体组成一个立方体。

  1. 每个正方体的六个面中的一部分会被其他部分正方体遮挡,未被遮挡的部分总面积即为该立方体的表面积,求表面积大小?
  2. 输入:
  3. 第一行两个正整数 N 和M, 1<= n, M<= 1000;
  4. 输出:
  5. 表面积大小
  6. 示例输入:
  7. 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;
	    }
	

测试结果
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值