Test instructions
For n segments and initial points, the maximum number of lines emitted by the initial point can be crossed (even through the intersection).
Analysis:
Enumerating the end points of a segment, judging whether the segments intersect, requires a rigorous template.
Code:
POJ 4048//sep9#include <iostream>using namespace Std;typedef long Long ll;const ll Maxn=2000;const ll maxl=40028; struct p{ll x, y;} A[maxn],b[maxn],p;ll tx,ty;int n;ll det (P a,p b,p c) {ll x1=b.x-a.x;ll y1=b.y-a.y;ll x2=c.x-a.x;ll Y2=c.y-a.y;return x1*y2 -x2*y1;} int get_sign (ll x) {if (x==0) return 0;return x>0?1:-1;} ll Mymax (ll A,ll b) {return a>b?a:b;} ll Mymin (ll A,ll b) {return a>b?b:a;} int between (P mid,p a,p b) {return Mid.x<=max (a.x,b.x) &&mid.y<=max (A.Y,B.Y) &&mid.x>=min (a.x , b.x) &&mid.y>=min (A.Y,B.Y); }bool crossed (P a,p b,p c,p d) {int d1,d2,d3,d4; d1=get_sign (det (a,b,c)); D2=get_sign (det (a,b,d)); D3=get_sign (Det (c,d,a )); D4=get_sign (Det (c,d,b)); if ((D1^D2) ==-2&& (D3^D4) ==-2) return True;if ((D1==0&&between (c,a,b)) | | (D2==0&&between (d,a,b)) | | (D3==0&&between (a,c,d)) | | (D4==0&&between (b,c,d))) return True;return false;} int process (P dir) {int cnt=0;dir.x=p.x+ (dir.x-p.x) *10000;dir.y=p.y+ (DIR.Y-P.Y)*10000;if (DIR.X==P.X&&DIR.Y==P.Y) return 0;for (int i=1;i<=n;++i) if (crossed (P,dir,a[i],b[i])) ++cnt; return CNT;} int main () {int i,cases;scanf ("%d", &cases), while (cases--) {scanf ("%d", &n), and for (I=1;i<=n;++i) scanf ("%lld% Lld%lld%lld ", &a[i].x,&a[i].y,&b[i].x,&b[i].y); scanf ("%lld%lld ", &p.x,&p.y); int ans=0;for (I=1;i<=n;++i) {Ans=max (ans,process (A[i])); Ans=max (Ans,process (B[i));} printf ("%d\n", ans);} return 0;}
POJ 4048 Chinese repeating Crossbow segment specification intersection judgment