
foj 2148 Moon Game 判断n个点有几个凸四边形 + 枚举4个点 + 判断点在三角形外
发布日期:2021-05-27 00:20:18
浏览次数:24
分类:精选文章
本文共 2838 字,大约阅读时间需要 9 分钟。
根据分析,对于给定的n个点,想要计算其中可以组成的凸四边形数目,下面提供了优化后的解答:
步骤如下:
计算总的四元组数目: 使用组合公式计算从n个点中选取4个点的组合数,即C(n,4) = n*(n-1)(n-2)(n-3)/24。
判断四个点是否形成凸四边形: 对每一个四元组(p, q, r, s),检查每个点是否都在其他三个点构成的三角形之外。如果有任意一个点在三角形内部,则该四元组无法形成凸四边形。
使用保留外侧的点判断法: 对于每个点p,请判断它是否在由其他三个点q、r、s构成的三角形之外。具体方法是计算点p到三角形qrs的位置关系。如果p在三角形之外,则满足条件,否则不满足。
避免共线情况: 在计算过程中,需要处理点在共线情况下的特殊情况,以免误判。
下面的代码片段展示了如何实现这一过程:
#include#include #include #include struct Point { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {} Point operator-(Point p) const { return Point(add(x, -p.x), add(y, -p.y)); } double operator^(Point p) const { return add(x * p.y - y * p.x); } double add(double a, double b) { return fabs(a + b) < EPS * (fabs(a) + fabs(b)) ? 0 : (a + b); } static const double EPS = 1e-9;};Point operator*(Point p, Point q) { return Point(p.x * q.x - p.y * q.y, p.x * q.y + p.y * q.x);}std::vector points;bool isConvex(Point p, Point q, Point r, Point s) { // 检查每个点是否都在其他三个点构成的三角形外侧 if (!outsideConvex(p, q, r, s)) { return false; } if (!outsideConvex(q, p, r, s)) { return false; } if (!outsideConvex(r, p, q, s)) { return false; } if (!outsideConvex(s, p, q, r)) { return false; } return true;}bool outsideConvex(Point h, Point a, Point b, Point c) { // 判断点h是否在三角形abc的外侧 double sum = area(a, b, c); sum += area(a, b, h); sum += area(b, c, h); sum += area(a, c, h); return fabs(sum) > EPS;}double area(Point a, Point b, Point c) { return fabs(a ^ b - a ^ c);}int main() { int n; int t = 1; for (--t; t > 0; --t) { std::cin >> n; if (n < 4) { std::cout << 0 << std::endl; continue; } readPoints(n); int count = 0; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { for (int k = j + 1; k < n; ++k) { for (int l = k + 1; l < n; ++l) { if (isConvex(points[i], points[j], points[k], points[l])) { count++; } } } } } std::cout << count << std::endl; } return 0;}// 读取点的函数void readPoints(int n) { points.clear(); for (int i = 0; i < n; ++i) { double x, y; std::cin >> x >> y; points.push_back(Point(x, y)); }}
关键点解释:
- Point结构体:用于存储点的坐标,支持向量运算和点减法。
- isConvex函数:检查四个点是否每个都在其他三个点构成的三角形之外侧,从而判断是否为凸四边形。
- outsideConvex函数:使用面积检验的方法来判断点是否在三角形外侧,避免共线和其他特殊情况。
- readPoints函数:读取输入的点坐标。
- 主函数:计算四元组数,调用相关判断函数统计凸四边形数目。
优化技巧:
- 精度处理:使用一个小的精度值EPS来处理浮点数误差,避免不必要的误差判断。
- 结构化代码:使你的代码易于阅读和维护,同时保持高效性。
通过上述方法,可以正确计算n个点中能够组成的凸四边形的数目。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月19日 23时49分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vue.js学习-15-v-for循环数组内容
2019-03-17
kafka超时错误或者发送消息失败等错误,排错方式
2019-03-17
sockjs-node/info?t=1462183700002 报错解决方案
2019-03-17
网络协议和支持(一)、uuid模块
2019-03-17
numpy.frombuffer()
2019-03-17
Latex 错误集合
2019-03-17
浏览器打开winscp 系统错误。代码:5。 拒绝访问。
2019-03-17
Kubernetes 无法查询到并且无法删除pod实例的排查过程
2019-03-17
android中button修改不了背景颜色
2019-03-17
github 入门
2019-03-17
社区医疗app-Ui设计
2019-03-21
HTML 表单验证
2019-03-21
ubuntu System program problem detected
2019-03-21
面试题5:(事务管理) ACID 是什么?
2019-03-21
10.Mybatis执行流程
2019-03-21
通信过程图
2019-03-21
使用maven
2019-03-21
依赖范围scope
2019-03-21