蓝桥杯 算法训练 小生物的逃逸

资源限制

时间限制: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;
		}
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值