题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------
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
1 3
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const double eps=1e-10;
struct point
{
double x, y;
};
double min(double a, double b)
{
return a < b ? a : b;
}
double max(double a, double b)
{
return a > b ? a : b;
}
bool inter(point a, point b, point c, point d)
{
if (min(a.x, b.x) > max(c.x, d.x)||
min(a.y, b.y) > max(c.y, d.y)||
min(c.x, d.x) > max(a.x, b.x)||min(c.y, d.y) > max(a.y, b.y) ) return 0;
double h, i, j, k;
h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);
j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);
k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);
return h * i <= eps && j * k <= eps;
}
int main()
{
int n;
int i, j;
point p[117][2];
while(cin>>n && n)
{
for(i = 0; i < n; i++)
{
cin>>p[i][0].x>>p[i][0].y>>p[i][1].x>>p[i][1].y;
}
int count = 0;
for(i = 0; i < n; i++)
{
for(j = i+1; j < n; j++)
{
if(inter(p[i][0],p[i][1],p[j][0],p[j][1]))
count++;
}
}
cout<<count<<endl;
}
return 0;
}hdu 1086 You can Solve a Geometry Problem too(求线段相交点个数 模板)
原文地址:http://blog.csdn.net/u012860063/article/details/38150039