热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU1086.YoucanSolveaGeometryProblemtoo【判断两线段相交】【数学题】【12月30】

YoucanSolveaGeometryProblemtooProblemDescriptionManygeometry(几何)problemsweredesignedinth

You can Solve a Geometry Problem too

Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. And now, I also prepare a geometry problem for this final exam. According to the experience of many ACMers, geometry problems are always much trouble, but this problem is very easy, after all we are now attending an exam, not a contest :)
Give you N (1<=N<=100) segments(线段), please output the number of all intersections(交点). You should count repeatedly if M (M>2) segments intersect at the same point.

Note:
You can assume that two segments would not intersect at more than one point. 
 
Input Input contains multiple test cases. Each test case contains a integer N (1=N<=100) in a line first, and then N lines follow. Each line describes one segment with four float values x1, y1, x2, y2 which are coordinates of the segment’s ending. 
A test case starting with 0 terminates the input and this test case is not to be processed.
 
Output For each case, print the number of intersections, and one line one case.
 
Sample Input
2
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.00
3
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.000
0.00 0.00 1.00 0.00
0
 
Sample Output
1
3

一开始还控制精度···额,发现并不用~~只要处理好什么时候相交就可以了~~代码如下:

#include
#include
#include
using namespace std;
const int maxn = 110;
struct ss
{
double x1, x2, y1, y2;
double k;
bool flag;
};
bool check(ss a, ss b)
{
//无斜率平行
if(a.flag == b.flag && a.flag == false) return false;

//有一直线无斜率
if(a.flag == false || b.flag == false)
{
//a无斜率
if(a.flag == false)
{
double y = b.k*a.x1 + b.y1 -b.k*b.x1;
if(y max(b.y1, b.y2)) return false;
else return true;
}
else//b无斜率
{
double y = a.k*b.x1 + a.y1 -a.k*a.x1;
if(y max(a.y1, a.y2)) return false;
else return true;
}
}
//有斜率平行
if(a.k == b.k) return false;
else//不平行
{
double x = (b.y1-b.k*b.x1-a.y1+a.k*a.x1)/(a.k-b.k);
if(x max(a.x1, a.x2) || x max(b.x1, b.x2)) return false;
else return true;
}
}
int N, ans;
int main()
{
while(scanf("%d", &N) != EOF && N)
{
ss f[maxn];
ans = 0;
for(int i = 0;i {
scanf("%lf %lf %lf %lf", &f[i].x1, &f[i].y1, &f[i].x2, &f[i].y2);
if(f[i].x1 > f[i].x2)
{
swap(f[i].x1, f[i].x2);
swap(f[i].y1, f[i].y2);
}
if(f[i].x1 == f[i].x2) f[i].flag = false;//无斜率
else
{
f[i].flag = true;//有斜率
f[i].k = (f[i].y2 - f[i].y1)/(f[i].x2 - f[i].x1);
}
}
for(int i = 1;i for(int j = 0;j {
if(check(f[i], f[j])) ans ++;
}
cout < }
return 0;
}



推荐阅读
  • 本文详细探讨了一道涉及算法、C++及图论知识点的题目,适合对算法竞赛感兴趣的读者。通过分析题目【这是一道大水题】,我们将探索如何高效地处理区间查询与更新问题。本文由技术作者【ღCauchyོꦿ࿐】撰写,旨在帮助读者掌握相关技术和解题技巧。 ... [详细]
  • 深入探讨栈和队列的应用实例——铁轨问题(Rails, ACM/ICPC CERC 1997, UVa 514)。该问题设定在一个城市火车站,涉及n节车厢从A方向驶入车站,并需按照特定顺序驶出B方向的铁轨。本文将通过算法实现来验证特定顺序的可行性。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 本问题探讨了一个经典的数字猜测游戏。玩家B需要通过一系列的猜测来确定玩家A心中所想的一个数字m,每次猜测后,A会给出反馈:'太高'、'太低'或'正确'。挑战在于计算B在给定次数n内能够准确猜测的最大数字。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 探讨了一个关于Windows C++开发中遇到的乱码问题,特别是在处理宽字符时出现的情况。本文通过一个具体的示例——一个简单的窗口应用程序,展示了如何正确地使用宽字符以避免乱码。 ... [详细]
  • 本文探讨了一个在Mac Mavericks系统上使用Clang++成功编译但通过R CMD SHLIB构建并在R中加载时遇到‘符号未找到’错误的C++程序问题。文章详细分析了错误原因,并提供了有效的解决方案。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • 本文介绍了一个C++程序,该程序用于计算一个向量首尾索引的和。当向量长度为偶数时,程序会遇到对称对,如v1[0] + v1[last]与v1[last] + v1[0],这些实际上是相同的计算结果,因此需要排除重复项以提高效率。 ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • 在使用Visual Studio构建项目时遇到了IntelliSense错误,具体表现为预期的')'未找到。本文提供了详细的解决方案和可能的原因分析。 ... [详细]
  • 本文详细介绍了S5P4418处理器中的定时器模块,涵盖五个定时器(Timers 0-4)的特性与配置。这些定时器不仅支持PWM输出,还具备灵活的时钟源和预分频器设置,其中Timers 0和1共享一个预分频器,而Timers 2、3和4则共享另一个预分频器。默认情况下,2nboot配置为200MHz。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细解释了华为ENSP模拟器中常用的命令,涵盖用户模式、系统模式、接口模式和地址池视图模式下的操作。这些命令对于进行计算机网络实验至关重要,帮助用户更好地理解和配置路由器及PC机的通信。 ... [详细]
author-avatar
赖-哥_528
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有