#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for (int i=0; i < (n); i++) using namespace std; typedef long long ll; typedef double D; // 座標値の型。doubleかlong doubleを想定 typedef complex P; // Point typedef pair L; // Line typedef vector

VP; const D EPS = 1e-9; // 許容誤差。問題によって変える #define X real() #define Y imag() #define LE(n,m) ((n) < (m) + EPS) #define GE(n,m) ((n) + EPS > (m)) #define EQ(n,m) (abs((n)-(m)) < EPS) // 内積 dot(a,b) = |a||b|cosθ D dot(P a, P b) { return (conj(a)*b).X; } // 外積 cross(a,b) = |a||b|sinθ D cross(P a, P b) { return (conj(a)*b).Y; } // 点の進行方向 int ccw(P a, P b, P c) { b -= a; c -= a; if (cross(b,c) > EPS) return +1; // counter clockwise if (cross(b,c) < -EPS) return -1; // clockwise if (dot(b,c) < -EPS) return +2; // c--a--b on line if (norm(b) < norm(c)) return -2; // a--b--c on line or a==b return 0; // a--c--b on line or a==c or b==c } // 直線と点 bool isecLP(P a1, P a2, P b) { return abs(ccw(a1, a2, b)) != 1; // return EQ(cross(a2-a1, b-a1), 0); と等価 } // 直線と直線 bool isecLL(P a1, P a2, P b1, P b2) { return !isecLP(a2-a1, b2-b1, 0) || isecLP(a1, b1, b2); } // 直線と線分 bool isecLS(P a1, P a2, P b1, P b2) { return cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS; } // 線分と線分 bool isecSS(P a1, P a2, P b1, P b2) { return ccw(a1, a2, b1)*ccw(a1, a2, b2) <= 0 && ccw(b1, b2, a1)*ccw(b1, b2, a2) <= 0; } // 線分と点 bool isecSP(P a1, P a2, P b) { return !ccw(a1, a2, b); } int main() { int n; scanf("%d", &n); P a[n], b[n]; for (int i = 0; i < n; i++) { D x1, y1, x2, y2; scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2); a[i] = P(x1, y1); b[i] = P(x2, y2); } int ans = 1; for (int i = 0; i < n; i++) { P sp, ep; int cnt = 0; for (int j = 0; j < n; j++) { sp = a[i]; ep = b[j]; cnt = 0; for (int k = 0; k < n; k++) { cnt += isecLS(sp, ep, a[k], b[k]); } ans = max(ans, cnt); } } printf("%d\n", ans); }