GitHub

算法训练 小生物的逃逸

资源限制
时间限制: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;
  数据保证所有球严格不接触,小生物都不在球面上。
 
 
方法不是很巧,主要就是求距离
 1 #include<iostream>
 2 using namespace std;
 3 //author:ZQ
 4 int select(double a,double b,double c,double d,double x,double y,double z){
 5     double line;
 6     line=(a-x)*(a-x)+(b-y)*(b-y)+(c-z)*(c-z);
 7     if(line<d*d){
 8         return 1;
 9     }else{
10         return 0;
11     }
12 }
13 int main(){
14     int n,m;
15     cin>>n>>m;
16     double s[n][4];
17     int sum[m]={0};
18     for(int i=0;i<n;i++){
19         cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];
20     }
21     double x,y,z;
22     int st;
23     for(int i=0;i<m;i++){
24         cin>>x>>y>>z;
25         for(int j=0;j<n;j++){
26             st=select(s[j][0],s[j][1],s[j][2],s[j][3],x,y,z);
27             sum[i]=sum[i]+st;
28         }
29     }
30     for(int i=0;i<m;i++){
31         cout<<sum[i]<<" "; 
32     }
33     return 0;
34 } 

 

posted @ 2020-02-29 17:49  繁华似锦觅安宁  阅读(295)  评论(0编辑  收藏  举报