■0143 Altair and Vega
牽牛と織女を結ぶ線分が,三角形を構成する線分と何回交差するかで答えは決まる.
0,2回:遮断されていない1回:遮断されている
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n; P ps1, ps2, ps3; P k, s; void run(){ n=sc.nextInt(); for(int i=0; i<n; i++){ int xp1=sc.nextInt(); int yp1=sc.nextInt(); int xp2=sc.nextInt(); int yp2=sc.nextInt(); int xp3=sc.nextInt(); int yp3=sc.nextInt(); int xk=sc.nextInt(); int yk=sc.nextInt(); int xs=sc.nextInt(); int ys=sc.nextInt(); ps1=new P(xp1, yp1); ps2=new P(xp2, yp2); ps3=new P(xp3, yp3); k=new P(xk, yk); s=new P(xs, ys); solve(); } } void solve(){ if(crsSS(k, s, ps1, ps2)^crsSS(k, s, ps2, ps3)^crsSS(k, s, ps3, ps1)){ println("OK"); }else{ println("NG"); } } boolean crsSS(P p1, P p2, P q1, P q2){ if(max(p1.x, p2.x)+EPS<min(q1.x, q2.x)) return false; if(max(q1.x, q2.x)+EPS<min(p1.x, p2.x)) return false; if(max(p1.y, p2.y)+EPS<min(q1.y, q2.y)) return false; if(max(q1.y, q2.y)+EPS<min(p1.y, p2.y)) return false; return signum(p2.sub(p1).det(q1.sub(p1))) *signum(p2.sub(p1).det(q2.sub(p1)))<EPS &&signum(q2.sub(q1).det(p1.sub(q1))) *signum(q2.sub(q1).det(p2.sub(q1)))<EPS; } class P{ double x, y; P(){ this(0, 0); } P(double x, double y){ this.x=x; this.y=y; } P add(P p){ return new P(x+p.x, y+p.y); } P sub(P p){ return new P(x-p.x, y-p.y); } P mul(double m){ return new P(x*m, y*m); } P div(double d){ return new P(x/d, y/d); } double abs(){ return Math.sqrt(abs2()); } double abs2(){ return x*x+y*y; } double arg(){ return Math.atan2(y, x); } // inner product double dot(P p){ return x*p.x+y*p.y; } // outer product double det(P p){ return x*p.y-y*p.x; } P rot90(){ return new P(-y, x); } // conjugation P conj(){ return new P(x, -y); } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿