1+ import java .io .*;
2+ import java .util .*;
3+ public class cowjump {
4+ public static int pointYCompare (Point p1 , Point p2 ) {
5+ // Compare points
6+ // Check if p2 is above, below, or next to p1
7+ System .out .println ("pointycompare((" +p1 .x +"," +p1 .y +"),(" +p2 .x +"," +p2 .y +")" );
8+ if (p1 .y == p2 .y ) {
9+ System .out .println ("output: 0" ); // Same Y
10+ return 0 ;
11+ }
12+ if (p2 .y < p1 .y ) {
13+ System .out .println ("output: -1" ); // below
14+ return -1 ;
15+ }
16+ if (p2 .y > p1 .y ) {
17+ System .out .println ("output: 1" ); // above
18+ return 1 ;
19+ }
20+ System .out .println ("NONE OF THE ABOVE" ); // This code should never run, but just keeping this to prevent syntax errors
21+ return -9999999 ;
22+ }
23+ public static int linesCompare (LineSegement m , LineSegement l ) {
24+ int output = pointYCompare (m .a , l .a ) * pointYCompare (m .b , l .b );;
25+ System .out .println ("Intersection of line " +m +" and " +l + " is " +output + " == -1" );
26+ return output ;
27+ }
28+ public static void testIntersections () {
29+ assert Point .intersection (new Point (0 ,0 ), new Point (2 ,9 ), new Point (0 ,1 ), new Point (6 ,1 ))== true ;
30+ //assert Point.intersection(new Point(0,0), new Point(1,1), new Point(3,3), new Point(3,12))== false;
31+ assert linesCompare (new LineSegement (new Point (0 ,0 ), new Point (2 ,3 )),new LineSegement (new Point (0 ,3 ),new Point (9 ,1 ))) == -1 ;
32+ System .out .println ("All Tests OK!" );
33+ }
34+
35+ public static boolean sweepCheck (LineSegement s ,Point [][] input ) {
36+ for (int i = 0 ; i < input .length ; i ++) {
37+ System .out .println ("Checking line " +i );
38+ if (input [i ][0 ] == null && input [i ][1 ] == null ) {
39+ System .out .println ("End of segments" );
40+ break ;
41+ }
42+ System .out .println ("Checking " +s .a .x +" - " +input [i ][0 ].x + " - " +s .b .x );
43+ boolean firstWithinLine = (s .a .x <= input [i ][0 ].x && s .b .x >= input [i ][0 ].x );
44+ System .out .println ("(s.a.x <= input[i][0].x && s.b.x >= input[i][0].x)" );
45+ System .out .println ((s .a .x <= input [i ][0 ].x )+" && " + (s .b .x >= input [i ][0 ].x ));
46+ System .out .println ("firstWithinLine = " +firstWithinLine );
47+ //|| (s.a.y <= input[i][0].y && s.b.y >= input[i][0].y);
48+ if (firstWithinLine ) {
49+ // TODO check line cross logic
50+ LineSegement full = new LineSegement (input [i ][0 ], input [i ][1 ]);
51+ if (linesCompare (s ,new LineSegement (full .atX_ (s .a .x ),full .atX_ (s .a .y ))) == -1 ) {
52+ System .out .println ("Intersect!" );
53+ return true ;
54+ }else {
55+ System .out .println ("No Intersection!" );
56+ }
57+ //continue; // Both statements may be true
58+ }
59+ boolean secondWithinLine = (s .a .x <= input [i ][1 ].x && s .b .x >= input [i ][1 ].x );
60+ //|| (s.a.y <= input[i][0].y && s.b.y >= input[i][0].y);
61+ if (secondWithinLine && !firstWithinLine ) {
62+ // TODO check line cross logic
63+ LineSegement full = new LineSegement (input [i ][0 ], input [i ][1 ]);
64+ if (linesCompare (s ,new LineSegement (full .atX_ (s .a .x ), full .atX_ (s .b .x ))) == -1 ) {
65+ System .out .println ("Intersect!" );
66+ return true ;
67+ }else {
68+ System .out .println ("No Intersection!" );
69+ }
70+ }
71+
72+ }
73+ return false ;
74+ }
75+ public static void main (String [] args ) throws IOException {
76+ //testIntersections();
77+ //testIntersections();
78+ BufferedReader f = new BufferedReader (new FileReader ("cowjump2.in" ));
79+ int N = Integer .parseInt (f .readLine ());
80+ Point [][] input = new Point [N ][2 ];
81+ //System.out.println(input[0][0]);
82+ int output = -1 ;
83+ for (int i = 0 ; i < N ; i ++) {
84+ StringTokenizer st = new StringTokenizer (f .readLine ());
85+ Point a = new Point (Integer .parseInt (st .nextToken ()), Integer .parseInt (st .nextToken ()));
86+ Point b = new Point (Integer .parseInt (st .nextToken ()), Integer .parseInt (st .nextToken ()));
87+ boolean status ;
88+ if (a .x > b .x ) {
89+ status = sweepCheck (
90+ new LineSegement (b ,a ),
91+ input );
92+ }else {
93+ status = sweepCheck (
94+ new LineSegement (a ,b ),
95+ input );
96+ }
97+ System .out .println ("That was line " +i );
98+ output = i ;
99+ if (status ) {
100+ break ;
101+ }
102+
103+ input [i ][0 ] = a ;
104+ input [i ][1 ] = b ;
105+ /*for(int j = 0; j < i; j ++) {
106+ if(Point.intersection(input[j][0], input[j][1], input[i][0], input[i][1])) {
107+ PrintWriter pw = new PrintWriter("cowjump.out");
108+ pw.println(i+1);
109+ pw.close();
110+ System.exit(0);
111+ }
112+ }*/
113+ }
114+ f .close ();
115+ PrintWriter pw = new PrintWriter ("cowjump.out" );
116+ pw .println (output +1 );
117+ pw .close ();
118+ System .exit (0 );
119+
120+ }
121+
122+ }
123+ class Point {
124+ double x ,y ;
125+ public Point (double x ,double y ) {
126+ this .x = x ;
127+ this .y = y ;
128+ }
129+ public Point (int x ,int y ) {
130+ this .x = x ;
131+ this .y = y ;
132+ }
133+ public Point () {
134+ this .x = 0 ;
135+ this .y = 0 ;
136+ }
137+ static boolean intersection (Point a , Point b ,Point c , Point d ) {
138+ // OLD CALCULATION CODE
139+ Point E = new Point (b .x - a .x , b .y - a .y );
140+ Point F = new Point (d .x - c .x , d .y - c .y );
141+ Point P = new Point (-E .y , E .x );
142+ Point Q = new Point (a .x - c .x , a .y - c .y );
143+ double k = F .x * P .x + F .y * P .y ;
144+ if (k == 0 ) {
145+ // Parallel
146+ return false ;
147+ }
148+ double h = (Q .x * P .x + Q .y * P .y )/(k );
149+ if (0 <= h && h <= 1 ) {
150+ return true ;
151+ }
152+ return false ;
153+ }
154+ public String toString () {
155+ return "(" +this .x + "," + this .y + ")" ;
156+ }
157+ }
158+
159+ class LineSegement {
160+ Point a ,b ;
161+ public LineSegement (Point a ,Point b ) {
162+ if (a .x > b .x ) {
163+ this .a = b ;
164+ this .b = a ;
165+ }else {
166+ this .a = a ;
167+ this .b = b ;
168+ }
169+ }
170+ public double atX (double x ) {
171+ if (this .a .y == this .b .y ) { // Straight
172+ return this .a .y ;
173+ }else {
174+ return this .a .y * (x /this .a .x );
175+ }
176+ }
177+ public Point atX_ (double x ) {
178+ return new Point (x ,this .atX (x ));
179+ }
180+ public String toString () {
181+ return this .a .toString () + " -- " +this .b .toString ();
182+ }
183+ }
0 commit comments