标签:
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这是一道几何题。 就是在于你是否会推断两条直线直接是否有交点的方法。剩下就非常easy了。推断AB和CD两线段是否有交点:同一时候满足两个条件:(‘x‘表示叉积)1.C点D点分别在AB的两側.(向量(ABxAC)*(ABxAD)<=0)2.A点和B点分别在CD两側.(向量(CDxCA)*(CDxCB)<=0)</pre><pre name="code" class="cpp"> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> using namespace std; struct Node { double x1, y1, x2, y2; }point[105]; int n; double work(double x1, double y1, double x2, double y2) { return x1 * y2 - x2 * y1; } bool judge(int i, int j) { double a = work(point[i].x1 - point[j].x1, point[i].y1 - point[j].y1, point[j].x2 - point[j].x1, point[j].y2 - point[j].y1); double c = work(point[j].x2 - point[i].x1, point[j].y2 - point[i].y1, point[i].x2 - point[i].x1, point[i].y2 - point[i].y1); double b = work(point[i].x2 - point[j].x1, point[i].y2 - point[j].y1, point[j].x2 - point[j].x1, point[j].y2 - point[j].y1); double d = work(point[j].x1 - point[i].x1, point[j].y1 - point[i].y1, point[i].x2 - point[i].x1, point[i].y2 - point[i].y1); a = a * b; c = c * d; if(a <= 0 && c <= 0) return true; return false; } int main() { while(cin >> n, n){ for(int i = 0; i < n; i++) cin >> point[i].x1 >> point[i].y1 >> point[i].x2 >> point[i].y2; int count = 0; for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) if(judge(i, j)) count++; } cout << count << endl; } return 0; }
HDU 1086:You can Solve a Geometry Problem too
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/5059561.html