题目描述
给出 nn 个圆,保证任意两个圆都不相交且不相切。
然后给出两个点 (x_1,y_1),(x_2,y_2)(x1,y1),(x2,y2),保证均不在某个圆上。现在要从 (x_1,y_1) \to (x_2,y_2)(x1,y1)→(x2,y2) 画条曲线,问这条曲线最少穿过多少次圆的边界?
输入格式
- 第一行为一个整数 nn,表示圆的个数;
- 第二行是 nn 个整数,表示 nn 个圆的 xx 坐标;
- 第三行是 nn 个整数,表示 nn 个圆的 yy 坐标;
- 第四行是 nn 个整数,表示 nn 个圆的半径 rr;
- 第五行是四个整数 x_1,y_1,x_2,y_2x1,y1,x2,y2。
输出格式
仅一个整数,表示最少要穿过多少次圆的边界。
输入输出样例
输入
7 1 -3 2 5 -4 12 12 1 -1 2 5 5 1 1 8 1 2 1 1 1 2 -5 1 12 1输出
3
import java.util.Scanner;
public class P1652圆 { //不用double 不然输出是3.0
static int n;//圆的个数
static int x[]=new int[55];//x坐标
static int y[]=new int[55];//y的坐标
static int r[]=new int[55];//r的半径
static int x1,x2,y3,y2,time;//四个整数
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
for(int i=1;i<=n;i++)
x[i]=in.nextInt();
for(int i=1;i<=n;i++)
y[i]=in.nextInt();
for(int i=1;i<=n;i++)
r[i]=in.nextInt();
x1=in.nextInt();
y3=in.nextInt();
x2=in.nextInt();
y2=in.nextInt();
for(int i=1;i<=n;i++) {//想用sqrt前面就要加Math
if(Math.sqrt((x1-x[i])*(x1-x[i])+(y3-y[i])*(y3-y[i]))<r[i]&&Math.sqrt((x2-x[i])*(x2-x[i])+(y2-y[i])*(y2-y[i]))>r[i])time++;//判断距离,要这两个圆同时满足不在同一圆内次数数才++
if(Math.sqrt((x2-x[i])*(x2-x[i])+(y2-y[i])*(y2-y[i]))<r[i]&&Math.sqrt((x1-x[i])*(x1-x[i])+(y3-y[i])*(y3-y[i]))>r[i])time++;
}
System.out.println(time);
in.close();
}
}