算法训练 小生物的逃逸
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
空间中有n个球,这些球不相交也不相切。有m个可以视为质点的小生物,可能在某些球内,也可能在所有球之外,但不会在球面上。问这些生物从原来的地方逃逸到所有球外面的空间,至少要经过多少层球面。
输入格式
第一行两个数n、m:表示球的数量和小生物的数量;
接下来n行每行四个整数Xi、Yi、Zi和Ri:表示一个球的三维坐标和半径;
接下来m行每行三个整数Xi、Yi、Zi:表示一个生物的坐标。
接下来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
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 }
转载请标明出处