Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 8206 | Accepted: 3736 |
Description
Input
Output
Sample Input
5 0 0 4 4 0 4 4 0 5 0 7 6 1 0 2 3 5 0 7 6 3 -6 4 -3 2 0 2 27 1 5 18 5 0 3 4 0 1 2 2 5
Sample Output
INTERSECTING LINES OUTPUT POINT 2.00 2.00 NONE LINE POINT 2.00 5.00 POINT 1.07 2.20 END OF OUTPUT 思路:判断直线间的关系,注意在区分平行不相交和平行相交的情况,我用的直线的一般式,深刻体会到C++在实现算法方面的简洁方便!#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> //1269 Accepted 172K 0MS C++ 2353B 2013-06-04 21:21:17 using namespace std; const double eps = 1e-8; int dcmp(double x) { if(fabs(x)<eps) return 0; if(x>0) return 1; return -1; } struct point { double x; double y; point() {} point(double a, double b) : x(a), y(b){} }; point operator - (const point &a, const point &b) { return point(a.x-b.x, a.y-b.y); } point operator +(const point &a, const point &b) { return point(a.x+b.x, a.y+b.y); } double det(const point a, const point b) { return a.x*b.y - a.y*b.x; } double dot(const point a, const point b) { return a.x*b.x + a.y*b.y; } point operator * (const double p, const point &a) { return point(a.x*p, a.y*p); } point operator / (const point a, const double p) { return point(a.x/p, a.y/p); } struct line { point a, b; line() {} line(point x, point y):a(x), b(y) {} }; bool parallel(line a, line b) { return !dcmp(det(a.a-a.b, b.a-b.b)); } bool line_make_point(line a, line b, point &res) { if(parallel(a, b)) return false; double s1 = det(a.a-b.a, b.b-b.a); double s2 = det(a.b-b.a, b.b-b.a); res = (s1*a.b - s2*a.a)/(s1-s2); return true; } bool is_point_online(line v, point b) { double A, B, C; A = v.b.y - v.a.y; B = v.a.x - v.b.x; C = det(v.b, v.a); if(dcmp(A*b.x+B*b.y+C)==0) { return true; } return false; } int main() { int T; scanf("%d", &T); double x1, y1, x2, y2, x3, y3, x4, y4; printf("INTERSECTING LINES OUTPUT\n"); while(T--) { scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2); scanf("%lf%lf%lf%lf", &x3, &y3, &x4, &y4); line a(point(x1, y1), point(x2, y2)); line b(point(x3, y3), point(x4, y4)); bool ans = parallel(a, b); if(ans&&is_point_online(a, b.a)) { printf("LINE\n"); continue; } if(ans) { printf("NONE\n"); continue; } bool flag = false; point res; flag = line_make_point(a, b, res); if(flag) { printf("POINT %.2lf %.2lf\n", res.x, res.y); } } printf("END OF OUTPUT\n"); return 0; }