从立体几何问题看降低编程复杂度人大附中高亦陶引言:一类立体几何问题O(1)的空间复杂度O(1)的时间复杂度并非公认的简单题巨大的编程复杂度1运用合适的思维方式使用方程是一种进步方程是一种抽象的、通用的解题方法但是方程有时会忽略一部分已知信息通过具体地思考、充分利用已知信息可以从本质入手,降低编程复杂度例1ModelRocketHeight给出两条直线的起点和方向,求它们公垂线中点的高度。直线方向用仰角和方向角表示。数据的初步处理和思路公垂线叉积方向向量nab1,tan,sectan消元?行列式?浮点误差?根据空间向量基本定理有唯一解尝试解题可以化成三元一次方程组麻烦ABADDEBE132anb进一步思考ABADDEBEABDEDEnnn2DEABDEnnnnn另外两个未知量ABABDEADBE三角形内已知一边和内角,求另一边长最后一步2cosADDAPAPADAPAPADAPAPAPaaaaaaaa2ABPBPBPBABPBbbbbbbbbAPABPB小结22212ABDEABABDEABPBAPABPBAPADAPOCOAADDEnnnbbbaa将盲目的方程组求解改为一系列向量运算降低了编程复杂度2注意分类讨论大量的分类+复杂的判断=难以承受的编程复杂度合理地把不同的情况合并起来可以大大改善这种状况例2CrossingPrisms平面内有一个简单多边形。多边形边数≤4,每个顶点都是整点,坐标取值范围为[0,10]。顶点按照逆时针方向排序。现在将这个多边形分别放置在xz面和yz面上。它们关于面x=y对称。分别以这两个多边形为底,以y轴和x轴为母线,以10为高作两个棱柱。求这两个棱柱的交的表面积。关注表面观察某个柱的一个侧面它的一部分是交的表面多数情况如果侧面与底面不平行交的表面一定是用侧面截柱得到的截面面积×cos二面角=射影面积二面角很容易求射影面积=柱底图形与y1≤y≤y2的交的面积重要情况如果侧面与底面平行边数≤4可以证明只有图中两种情况形状特殊的面柱底图形在特定高度上的宽面积=宽2-(宽-边长)2对正方形也适用!继续利用这个宽也可以用来计算射影面积!射影面积=sum((宽1+宽2)*高/2)需要对高度排序算法框架对高度排序计算每点高度处的宽枚举每一条边判断平行与否宽2-(宽-边长)2或者2*射影面积/cos二面角计算宽处理特殊情况求所有边与y=yk的交点最大值-最小值?完全不考虑不规范交点?利用逆时针顺序关系确定交点方向面积≠(宽1+宽2)*高/2?在局部改变宽的定义,利用点的逆时针序忽略一些边,使两个宽不同修改两个点的高度顺序最终使得面积可以照常计算特判会打破先前的算法框架一种具体的处理办法忽略和每个点相邻的边,让凹角顶点对应的宽较大同时确保四个点的高按逆时针顺序呈1,2+,2-,3或3,2-,2+,1的形式小结:合并的效果情况情况情况判断比较复杂的计算途径有点复杂的计算途径另外的计算途径判断情况情况情况处理中间量另外的计算途径剩下的计算途径总结和启示算法是多样化的,选择时要注重适用性在遇到新问题时,首先想一想能不能在现有框架内解决,而不是随意添加新的内容对算法同样可以从类似内容中合并相同点从而达到精简的效果谢谢