资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
空间中有n个球,这些球不相交也不相切。有m个可以视为质点的小生物,可能在某些球内,也可能在所有球之外,但不会在球面上。问这些生物从原来的地方逃逸到所有球外面的空间,至少要经过多少层球面。
输入格式
第一行两个数n、m:表示球的数量和小生物的数量;
接下来n行每行四个整数Xi、Yi、Zi和Ri:表示一个球的三维坐标和半径;
接下来m行每行三个整数Xi、Yi、Zi:表示一个生物的坐标。
输出格式
一行m个数:表示每个小生物逃逸时至少经过的球面数。
样例输入
2 2
0 0 0 2
0 0 0 4
0 0 1
0 0 3
样例输出
2 1
数据规模和约定
1<=n、m<=100,|Xi|、|Yi|、|Zi|<=10000,1<=Ri<=10000;
数据保证所有球严格不接触,小生物都不在球面上。
import java.util.Scanner;
public class Main {
/*
* 思路:主要是计算 生物所在位置与坐标原点之间的距离。如果小于半径,则该生物在球内
* */
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //n个球
int m = sc.nextInt(); //m个生物
double[][] ball = new double[n][4];//存放球的信息(球心坐标 和 半径)
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
ball[i][j]=sc.nextDouble();
}
}
int[] sum = new int[m];//存放m个生物经过的球面
for(int i=0;i<m;i++){
double a = sc.nextDouble();
double b = sc.nextDouble();
double c = sc.nextDouble();
for(int j=0;j<n;j++){ //判断生物i是否在球j内
if(select(ball[j][0], ball[j][1], ball[j][2], ball[j][3], a, b, c)){//在球内
sum[i]++;//生物i经过的球面数+1
}
}
}
for(int i=0;i<m;i++){//输出每个生物至少逃离的球面数
System.out.print(sum[i]+" ");
}
}
//计算生物位置与坐标原点之间的距离。若小于半径,则返回true(该生物在球内)
private static boolean select(double x,double y,double z,double r,double a,double b,double c){
double d = (a-x)*(a-x)+(b-y)*(b-y)+(c-z)*(c-z);
if(d<r*r){//在球内
return true;
}else{
return false;
}
}
}