来自:http://www.cppblog.com/zzfmars/articles/121794.html
一。基础题目
1.1 有固定算法的题目
A, 最近点对问题
最近点对问题的算法基于扫描线算法。
ZOJ
POJ
B,最小包围圆
最小包围圆的算法是一种增量算法,期望是O(n)。
ZOJ
HDU
C,旋转卡壳
POJ 3608
POJ 2079
1.2 比较简单的题目
HDU
CII 3000 Tree-Lined Streets,几何+贪心
CII 4676 Geometry Problem,模板题
HDU 3272 Mission Impossible,枚举+镜面反射思想
POJ 3334
POJ 1819
CII 3905 Meteor,貌似还是比较简单
ZOJ 2589 Circles,平面图的欧拉定理,圆的相交
POJ 2194 Stacking Cylinders,向量旋转
二。经典算法
2.1 三角剖分
三角剖分这个东西貌似去年流行了一下,高校联赛时某U连续出了两次。实际上对多边形进行三角剖分是一个很常见的算法思想,因为三角形是一个比较简单的凸多边形,可以对两个三角形比较容易地求公共面积,这也是三角剖分最常见的用途。对这个算法进行扩展,就可以求两个简单多边形的面积交了。主要是理解有向面积的概念。
第一类是圆与三角形的相交,主要做法是分情况讨论。
POJ
POJ
ZOJ
第二类是多边形与多边形相交。
HDU
三角形剖分的另一种变种是梯形剖分,应用起来稍有局限性,但是比三角形剖分好写。
POJ
多边形的重心问题,也是三角形剖分的应用:
CII
2.2 极角排序
顾名思义,极角排序一般就是有一个圆心的问题,将平面上各个点按照与圆心极角进行排序。然后就可以在线性扫描之中解决一些统计问题。不过这类问题就稍稍超出计算几何范畴了。
UVA
CII 4064 Magnetic Train Tracks,极角排序的统计问题,补集思想。
UVA
POJ 2280
2.3 扫描线算法
扫描线算法,需要使用到平衡树辅助,写起来比较复杂(对于本菜而言)。关于平衡树,我建议是直接使用STL的set或map。所以你需要掌握一些C++的知识,才能够看懂一份使用了map与set的代码。当年学习OI牛的代码我看得很纠结。不过只要理解了“事件点”这一个概念后就比较好办了。
HDU
POJ
下面两个题目都是关于多边形的扫描线算法,关于平面上许多凸多边形套了多少层的问题。
CII
UVA
2.4 其他题目
POJ
三。不确定算法/极值问题
POJ 3301
SPOJ 4409 Circle vs Triangle(AREA1),也是模拟退火
UVA 11562 Hard Evidence,应用三分极值法求极值。
四。传统几何、公式题
UVA有一个名叫Shahriar Manzoor喜欢出这些题目,喜欢这类题目的同志可以研究一本名叫《近代欧式几何学》的书。不过这些题目一般中学几何知识能够解决。
CII 4413
UVA
CII 4714
POJ
五。几何结合其他算法,麻烦题
HDU
CII 4448 Conduit Packing,问一个大圆能否放下四个小圆。颇为变态的Final题,算法都很基础,就是二分一个答案,枚举两个已知圆,求与已知的两圆公切的第三个圆,枚举放置的位置……关键是不好想。
CII 4510 Slalom 几何+最短路
UVA
HDU
CII 4499 Camera in the Museum,有关圆形处理的,很不错的题目。
CII 2395 Jacquard Circuits,Pick公式的应用
POJ 3747 Scout YYF II,又是一个几何问题,需要猜想一下。
POJ 3336 ACM Underground,几何预处理,并查集
CII 4428 Solar Eclipse,也是不错的题目,涉及圆的问题
CII 4206 Magic Rings,dancing links解重复覆盖问题,二分,百度杯也有个类似的题目。
POJ 1263
CII 4161 Spherical Mirrors,上面题目的三维版本。
POJ 3521 Geometric Map,复杂的预处理,可以用于自虐
CII 3270 Simplified GSM Network
CII 4617 Simple Polygon,平面上有一堆点,叫你用一笔画把这些点连起来,连成一个闭合的简单多边形,线不允许出现相交。改造一下凸包算法即可。
当然,除了上述的题目外,还有许多比较精彩的计算几何题目等待大家发掘。