版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jane_JXR/article/details/78145336
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6206
题目大意及分析:每组数据四个点,前三个点能组成三角形,判断另外一个点是否在这个三角形外接圆的外部,输出相应的结果。
高精度问题,数据范围比较大,本来想着用浮点数把数据范围缩小,一直WA,尝试用java写了一发。
注意java提交时不能加包名,否则会一直WA。第一次用java写题,虽然过程很坎坷,不过A了还是很开心,纪念一下。
CODE:
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int t;
Scanner scan= new Scanner(System.in);
BigDecimal two=new BigDecimal("2.0");
t=scan.nextInt();
for(int i=0;i<t;i++)
{
BigDecimal x1,y1,x2,y2,x3,y3,px,py;
x1=scan.nextBigDecimal();
y1=scan.nextBigDecimal();
x2=scan.nextBigDecimal();
y2=scan.nextBigDecimal();
x3=scan.nextBigDecimal();
y3=scan.nextBigDecimal();
px=scan.nextBigDecimal();
py=scan.nextBigDecimal();
/*a1=x2-x1,b1=y2-y1,c1=(a1*a1+b1*b1)/2*/
BigDecimal a1=x2.subtract(x1),b1=y2.subtract(y1);
BigDecimal c1=(a1.multiply(a1).add(b1.multiply(b1))).divide(two);
/*a2=x3-x1,b2=y3-y1,c2=(a2*a2+b2*b2)/2*/
BigDecimal a2=x3.subtract(x1),b2=y3.subtract(y1);
BigDecimal c2=(a2.multiply(a2).add(b2.multiply(b2))).divide(two);
/*d=a1*b2-a2*b1*/
BigDecimal d=a1.multiply(b2).subtract(a2.multiply(b1));
/*三角形外心(x1+(c1*b2-c2*b1)/d,y1+(a1*c2-a2*c1)/d)*/
BigDecimal ansx=x1.add((c1.multiply(b2).subtract(c2.multiply(b1))).divide(d));
BigDecimal ansy=y1.add((a1.multiply(c2).subtract(a2.multiply(c1))).divide(d));
/*比较p点是否在三角形的外接圆外*/
BigDecimal dis1=((x1.subtract(ansx)).multiply(x1.subtract(ansx))).add((y1.subtract(ansy)).multiply(y1.subtract(ansy)));
BigDecimal dis2=((px.subtract(ansx)).multiply(px.subtract(ansx))).add((py.subtract(ansy)).multiply(py.subtract(ansy)));
//System.out.println(dis1);
//System.out.println(dis2);
if(dis1.compareTo(dis2)<0)
System.out.println("Accepted");
else
System.out.println("Rejected");
}
}
}