Use this to learn the idea, then write your own version.
12345678910111213141516 17import java.awt.*;18import hsa.*;19 20public class CCC2006s3TinCanTelephone21{22 static Console c;23 24 public static void main (String[] args)25 {26 c = new Console ();27 TextInputFile f = new TextInputFile ("s3.1.in");28 int xr, yr, xj, yj;29 int n, corners;30 int x0, y0, x1, y1, x2, y2;31 boolean touching;32 int touch = 0;33 34 xr = f.readInt ();35 yr = f.readInt ();36 xj = f.readInt ();37 yj = f.readInt ();38 39 n = f.readInt ();40 for (int i = 0 ; i < n ; i++)41 {42 touching = false;43 corners = f.readInt ();44 x0 = f.readInt ();45 y0 = f.readInt ();46 x1 = x0;47 y1 = y0;48 for (int j = 1 ; j < corners ; j++)49 {50 x2 = f.readInt ();51 y2 = f.readInt ();52 touching = touching || touchingSegments (xr, yr, xj, yj, x1, y1, x2, y2);53 x1 = x2;54 y1 = y2;55 }56 touching = touching || touchingSegments (xr, yr, xj, yj, x1, y1, x0, y0);57 if (touching)58 touch++;59 }60 c.println (touch);61 }62 63 64 public static boolean touchingSegments (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)65 {66 double m1, m2, b1, b2, xi, yi;67 if (x1 == x2)68 {69 m1 = Double.MAX_VALUE;70 b1 = 0;71 }72 else73 {74 m1 = (y1 - y2) / (x1 - x2);75 b1 = -m1 * x2 + y2;76 }77 if (x3 == x4)78 {79 m2 = Double.MAX_VALUE;80 b2 = 0;81 }82 else83 {84 m2 = (y3 - y4) / (x3 - x4);85 b2 = -m2 * x4 + y4;86 }87 88 89 if (m1 == m2)90 {91 92 93 94 if (m1 != Double.MAX_VALUE && m2 != Double.MAX_VALUE)95 return b1 == b2 && (between (x3, x1, x2) || between (x4, x1, x2));96 97 98 99 else100 return x1 == x3 && (between (y3, y1, y2) || between (y4, y1, y2));101 }102 else103 {104 105 106 if (m1 != Double.MAX_VALUE && m2 != Double.MAX_VALUE)107 {108 xi = (b2 - b1) / (m1 - m2);109 yi = m1 * xi + b1;110 return between (xi, x1, x2) && between (yi, y1, y2) && between (xi, x3, x4) && between (yi, y3, y4);111 }112 113 114 115 else116 {117 if (m1 == Double.MAX_VALUE)118 {119 xi = x1;120 yi = m2 * xi + b2;121 }122 else123 {124 xi = x3;125 yi = m1 * xi + b1;126 }127 return between (xi, x1, x2) && between (yi, y1, y2) && between (xi, x3, x4) && between (yi, y3, y4);128 }129 }130 }131 132 133 134 public static boolean between (double x, int a, int b)135 {136 return (x >= a && x <= b) || (x <= a && x >= b);137 }138}139