大一纯纯新手学习~
可能会有很多种解法(欢迎评论!)
自己的随手笔记,多多包涵
对了
左老师YYDS
题面:
描述 不知你是否注意到,四川大学每年都会在各宿舍楼里放老鼠药,以解决学生宿舍的老鼠问题。
今年,学校的领导为了更好的展开灭鼠的行动,引进了一项新的技术:SCU(Super Cat Union)。
它是通过两只机器猫对宿舍楼的扫描来判断老鼠的所在,然后采取相应的措施。
这下可惹急了我们的FatMouse,它通过努力,终于找到了SCU的一个bug…假设两只猫的工作范围各是一个球,猫位于球中心。在三维空间中两个球的相交点构成一个平面(假设在本题中两个球总是相交的)。
当老鼠在这个相交点构成的平面上时,SCU无法检测到老鼠的存在。 现在我们给出某一时刻两个机器猫的位置和他们工作范围的半径,
请问当FatMouse在某一个位置(x,y,z)上时,SCU是否能检测到FatMouse?输入 输入的第一行为总的测试数据组数n。接下来一共有n行,每行代表一组测试数据。
每组测试数据包括11个整数,前面4个是SCU第一个机器猫所在的位置和它的工作半径,接下来的4个是第二个机器猫的位置和工作半径。
最后3个数是FatMouse的位置。输出 对应每一组输入数据,判断FatMouse是否会被检测到。如果FatMouse能被检测到,输出Yes,否则,输出No。
//判题通道:http://acm.scu.edu.cn/soj/problem.action?id=1085
//提示:可以通过vjudge判题,选择SOJ 查找ID1085即可
测试用例
Input
3
0 0 0 8 10 0 0 8 5 5 5
0 0 0 8 10 0 0 8 5 0 0
0 0 0 8 10 0 0 8 0 8 0
Output
No
No
Yes
One Possible Version:
应该是一道简单几何题
通过读题获得:
已经掌握的情报(11个变量)
第一只猫: (x1,y1,z1) r1
第二只猫: (x2,y2,z2) r2
鼠鼠:(x,y,z)
那我们便可以求出
d1=pow((x-x1), 2)+pow((y-y1), 2)+pow((z-z1), 2)
d2=pow((x-x2), 2)+pow((y-y2), 2)+pow((z-z2), 2)
这是鼠鼠到两只小猫咪的距离平方
Case1:
如果d1>pow(r1,2)且d2>pow(r2,2)
那么鼠鼠已经摆脱了小猫咪的视线
这时候鼠鼠摆脱了SCU的追赶
Case2:
在平面上鼠鼠要卡BUG需要满足什么条件呢?
其实把两个球方程做差就可以求出来了!
m1=pow((x-x1), 2)+pow((y-y1), 2)+pow((z-z1), 2)-pow(r1,2);
m2=pow((x-x2), 2)+pow((y-y2), 2)+pow((z-z2), 2)-pow(r2,2);
m1-m2==0即可!
所以AC代码
#include<iostream>
#include<cmath>
using namespace std;
void supercat(int x1,int y1,int z1,int r1,int x2,int y2,int z2,int r2,int x,int y,int z){
int d1=pow((x-x1), 2)+pow((y-y1), 2)+pow((z-z1), 2)-pow(r1,2);//求差值
int d2=pow((x-x2), 2)+pow((y-y2), 2)+pow((z-z2), 2)-pow(r2,2);
//cout<<d1<<" "<<d2<<endl;
if(d1-d2==0||(d1>0&&d2>0)){
printf("No\n");
}else{
printf("Yes\n");
}
}
int main(){
int kk;
cin>>kk;
while(kk--){
int x1,y1,z1,r1,x2,y2,z2,r2,x,y,z;
cin>>x1>>y1>>z1>>r1>>x2>>y2>>z2>>r2>>x>>y>>z;
supercat(x1,y1,z1,r1,x2,y2,z2,r2,x,y,z);
}
}