ACM模版

描述

题解

计算几何 + 大浮点数……很恶心啊……用 java 写会容易些。

给定三个点,然后判断第四点是否在这三个点的外接圆内。

代码

import java.math.BigDecimal;
import java.util.Scanner;

class Util {
    public static BigDecimal calR(Dot a, Dot b) {
        return a.x.subtract(b.x).multiply(a.x.subtract(b.x)).add(a.y.subtract(b.y).multiply(a.y.subtract(b.y)));
    }
}

class Dot {
    public BigDecimal x, y;

    public Dot() {
    }

    public Dot(BigDecimal x, BigDecimal y) {
        this.x = x;
        this.y = y;
    }
}

public class Main {
    private static Scanner sc;

    public static void main(String[] args) {
        sc = new Scanner(System.in);
        BigDecimal two = new BigDecimal("2.00000");

        Dot dot1 = new Dot();
        Dot dot2 = new Dot();
        Dot dot3 = new Dot();
        Dot dot4 = new Dot();

        int T = sc.nextInt();
        for (int cnt = 1; cnt <= T; cnt++) {
   
            dot1.x = sc.nextBigDecimal();
            dot1.y = sc.nextBigDecimal();

            dot2.x = sc.nextBigDecimal();
            dot2.y = sc.nextBigDecimal();

            dot3.x = sc.nextBigDecimal();
            dot3.y = sc.nextBigDecimal();

            dot4.x = sc.nextBigDecimal();
            dot4.y = sc.nextBigDecimal();

            BigDecimal a = dot3.x.subtract(dot2.x).multiply(two);
            BigDecimal b = dot3.y.subtract(dot2.y).multiply(two);
            BigDecimal c = dot3.x.multiply(dot3.x).subtract(dot2.x.multiply(dot2.x)).add(dot3.y.multiply(dot3.y))
                    .subtract(dot2.y.multiply(dot2.y));

            BigDecimal e = dot2.x.subtract(dot1.x).multiply(two);
            BigDecimal f = dot2.y.subtract(dot1.y).multiply(two);
            BigDecimal g = dot2.x.multiply(dot2.x).subtract(dot1.x.multiply(dot1.x)).add(dot2.y.multiply(dot2.y))
                    .subtract(dot1.y.multiply(dot1.y));

            BigDecimal X = g.multiply(b).subtract(c.multiply(f)).divide(e.multiply(b).subtract(a.multiply(f)));
            BigDecimal Y = a.multiply(g).subtract(c.multiply(e)).divide(a.multiply(f).subtract(b.multiply(e)));

            Dot cir = new Dot(X, Y);

            BigDecimal r = Util.calR(cir, dot1);
            BigDecimal dis = Util.calR(cir, dot4);

            if (dis.compareTo(r) > 0) {
                System.out.println("Accepted");
            } else {
                System.out.println("Rejected");
            }
        }
    }
}