题意:给定n个长方体,求这些长方体组合成的物体的表面积和体积。想象组合后的几何体完全浸泡在水中,所求的即为几何体与水接触的面积以及所占据的体积。
可以考虑在坐标系中一个点一个点填充几何体,然后DFS标记出“水区域”。这样,与“水区域”接触的几何体的面积即为所求的表面积,非“水区域”的体积即为所求的体积。因为所给的坐标范围比较大,但n的范围比较小,需要对坐标进行离散化处理。
离散化的一些细节:若所给区间为[x,y]
,S
为所有坐标点排序后的数组,考虑下面两种:
- 离散区间
[x,y+1)
,写为[x,z)
,S
中包含的为所有的x
和z
。考虑两个区间[1,5),[6,11)
,填充之后如下图所示,离散坐标i
所表示的区间长度为S[i+1]-S[i]
,且两个区间中间的部分[5,6)
能够表示为未填充的状态。
- 离散区间
[x,y]
,S
中包含的为所有的x
和y
。考虑相同的两个区间[1,4],[6,10]
,填充之后如下图所示。离散坐标i
所表示的区间长度不能统一表示,需要增加一些额外的坐标点来处理。且两个区间中间的部分[5,5]
不能表示出状态,也需要增加一些额外的坐标点来处理。
选用第一种离散化的做法,添加0坐标使”水区域“连通。空间坐标\((i,j,k)\)所表示的体积为\((X[i+1]-X[i])*(Y[i+1]-Y[i])*(Z[i+1]-Z[i])\)。
也记一下第二种离散做法遇到的错误。line 99 X[sx++] = X[t] + 1;
,最初写的是X[sx++] = X[sx - 2] + 1
,没有达到预期的结果,且使得line 22 的assert
不成立。没有找到原因,可能是编译的问题,导致数组下标不是所想表示的下标?
1 |
|
1 |
|