蓝桥杯试题 算法训练 小生物的逃逸 C/C++

试题 算法训练 小生物的逃逸

资源限制
时间限制: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;
  数据保证所有球严格不接触,小生物都不在球面上。

思路:本题主要是考公式,判定小生物是在球的里面还是外面,而判定的方法是各坐标轴的差值的平方相加小于或者等于球面半径的平方则为在球当中,否则不在(也就不需要穿过此球面)
x1、y1、z1代表球,r为球的面积;x2、y2、z2代表小生物坐标
(x1-x2)(x1-x2)+(y1-y2)(y1-y2)+(z1-z2)(z1-z2)<=rr为在球面当中,否则不在(写一个详细的公式)

代码如下:

#include<iostream>
using namespace std;
main(){
	int n,m,a[105][4],b[105][3],i,j,k=0,k1=0;
	cin>>n>>m;
	for(i=0;i<n;i++){
		cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
	}
	for(j=0;j<m;j++){
		cin>>b[j][0]>>b[j][1]>>b[j][2];
	}
	for(j=0;j<m;j++){
		for(i=0;i<n;i++){
			k1=(b[j][0]-a[i][0])*(b[j][0]-a[i][0]);
			k1+=(b[j][1]-a[i][1])*(b[j][1]-a[i][1]);
			k1+=(b[j][2]-a[i][2])*(b[j][2]-a[i][2]);
			if(k1<=a[i][3]*a[i][3]){
				k++;
			}
		}
		cout<<k<<" ";
		k=0;
	}
}
发布了63 篇原创文章 · 获赞 64 · 访问量 3560

猜你喜欢

转载自blog.csdn.net/weixin_45269353/article/details/104715805