HDU 6206 Apple(高精度浮点数)

来源:互联网 发布:2017网络最火的歌曲 编辑:程序博客网 时间:2024/06/06 03:56

题目地址
题意:告诉你四个点,求最后一个点在不在前三个点围成的圆上。
思路:三个点连成的形状是一个三角形,那那个圆就是这个三角形的外接圆,那圆心应该就是在三角形的外心上,给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?我在网上找到的公式:

给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)
1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:
(x1-x)(x1-x)-(y1-y)(y1-y)=(x2-x)(x2-x)+(y2-y)(y2-y);
(x2-x)(x2-x)+(y2-y)(y2-y)=(x3-x)(x3-x)+(y3-y)(y3-y);
2.化简得到:
2*(x2-x1)x+2(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
2*(x3-x2)x+2(y3-y2)y=x3^2+y3^2-x2^2-y2^2;
令A1=2*(x2-x1);
B1=2*(y2-y1);
C1=x2^2+y2^2-x1^2-y1^2;
A2=2*(x3-x2);
B2=2*(y3-y2);
C2=x3^2+y3^2-x2^2-y2^2;

A1*x+B1y=C1;
A2*x+B2y=C2;
3.最后根据克拉默法则:
x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));
因此,x,y为最终结果。

结合这个结论(转自:传送门),直接用JAVA的BigDecimal类就好了。

import java.io.*;import java.util.*;import java.math.BigDecimal;public class Main{    public static void main(String args[])    {        Scanner cin = new Scanner(System.in);        int n=cin.nextInt();        while(n!=0)        {            n--;            BigDecimal[] x=new BigDecimal[4];            BigDecimal[] y=new BigDecimal[4];            for(int i=0;i<4;i++)            {                x[i]=cin.nextBigDecimal();                y[i]=cin.nextBigDecimal();            }            BigDecimal two=new BigDecimal(2);            BigDecimal a1,a2,b1,b2,c1,c2;            a1=two.multiply(x[1].subtract(x[0]));            b1=two.multiply(y[1].subtract(y[0]));            c1=x[1].multiply(x[1]).add(y[1].multiply(y[1])).subtract(x[0].multiply(x[0]).add(y[0].multiply(y[0])));            a2=two.multiply(x[2].subtract(x[1]));            b2=two.multiply(y[2].subtract(y[1]));            c2=x[2].multiply(x[2]).add(y[2].multiply(y[2])).subtract(x[1].multiply(x[1]).add(y[1].multiply(y[1])));            //System.out.println(a1+" "+b1);            //System.out.println(a1.multiply(b2).subtract(a2.multiply(b1)));            BigDecimal nx=(c1.multiply(b2).subtract(c2.multiply(b1))).divide(a1.multiply(b2).subtract(a2.multiply(b1)));            BigDecimal ny=(a1.multiply(c2).subtract(a2.multiply(c1))).divide(a1.multiply(b2).subtract(a2.multiply(b1)));            BigDecimal R=(nx.subtract(x[0]).multiply(nx.subtract(x[0]))).add(ny.subtract(y[0]).multiply(ny.subtract(y[0])));            BigDecimal dd=(nx.subtract(x[3]).multiply(nx.subtract(x[3]))).add(ny.subtract(y[3]).multiply(ny.subtract(y[3])));            long zero=0;            if(dd.compareTo(R)==1)            {                System.out.println("Accepted");            }            else            {                System.out.println("Rejected");            }        }    }}