题目链接: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