一道简单的算法题 -立方体堆叠计算面积-容斥原理(js/golang实现)
刷了一下算法题,分别用js和golang实现了一遍,比较简单的容斥问题
题目
在长度为N的正方形网格上, 堆叠立方体,计算堆叠后整个物体的表面积?
用例
//输入
[
[1, 2, 3],
[1, 0, 0],
[1, 0, 1]
]
//输出
解题思路
容斥原理:(引用百度)
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
因为整个物体形成的形状的有很多种可能性,所以直接计算并不方便
这时候我们直接用容斥原理,首先n个立方体纵向堆叠起来的面积是 n * 4 + 2,而整个物体需要减去的面积就是侧边重叠的部分,为嘛不重复计算,每个柱体只计算南面和西面重叠部分,只要和相邻的柱体比较高度,较低的柱体高度 * 2就是重叠面积, 去掉之后就是整个物体的面积
代码实现
javascript
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
let area = 0;
const N = grid