zoukankan      html  css  js  c++  java
  • SOJ 1085 SCU 简单计算几何

    BackGroud

    Year 2003
    不知你是否注意到,四川大学每年都会在各宿舍楼里放老鼠药,以解决学生宿舍的老鼠问题。 今年,学校的领导为了更好的展开灭鼠的行动,引进了一项新的技术:SCU(Super Cat Union)。 它是通过两只机器猫对宿舍楼的扫描来判断老鼠的所在,然后采取相应的措施。 这下可惹急了我们的FatMouse,它通过努力,终于找到了SCU的一个bug...

    The Problem

    假设两只猫的工作范围各是一个球,猫位于球中心。在三维空间中两个球的相交点构成一个平面(假设在本题中两个球总是相交的)。 当老鼠在这个相交点构成的平面上时,SCU无法检测到老鼠的存在。 现在我们给出某一时刻两个机器猫的位置和他们工作范围的半径, 请问当FatMouse在某一个位置(x,y,z)上时,SCU是否能检测到FatMouse?

    输入

    输入的第一行为总的测试数据组数n。接下来一共有n行,每行代表一组测试数据。 每组测试数据包括11个整数,前面4个是SCU第一个机器猫所在的位置和它的工作半径,接下来的4个是第二个机器猫的位置和工作半径。 最后3个数是FatMouse的位置。

    输出

    对应每一组输入数据,判断FatMouse是否会被检测到。如果FatMouse能被检测到,输出"Yes",否则,输出"No"。

    样例输入

    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

    样例输出

    No
    No
    Yes

    解题思路:

      本题有两种做法,一种是通过两个球的方程来推导出相交平面的方程,另一种则是通过判断与两个球心的距离和半径的关系来判断。一开始的时候想设立一个flag=0,看到两个球心的2个距离中有几个小于相应半径来判断,但是忽略了一个球可能在另一个球的情况,于是换了一种判断方法,即解决。

    AC代码:

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    
    int main(){
        ll x1,x2,x3,y1,y2,y3,z1,z2,z3,r1,r2;
        ll t;
        scanf("%ld",&t);
        while(t--){
            scanf("%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld",&x1,&y1,&z1,&r1,&x2,&y2,&z2,&r2,&x3,&y3,&z3);
            ll d1=(x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)+(z3-z1)*(z3-z1);
            ll d2=(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2);
            if(r1*r1<d1 && r2*r2<d2) printf("No
    ");
            else if(r1*r1-d1==r2*r2-d2) printf("No
    ");
            else printf("Yes
    ");
        }
        return 0;
    } 
  • 相关阅读:
    《黑马程序员》 内存管理的认识(Objective
    《黑马程序员》 description方法(Objective
    《黑马程序员》 类的加载和初始化(Objective
    《黑马程序员》 category分类的使用(Objective
    《黑马程序员》 OC构造方法(Objective
    《黑马程序员》 OC编译器特性(Objective
    《黑马程序员》 OC的三大特性(Objective
    《黑马程序员》 OC的认识和第一个OC(Objective
    《黑马程序员》 extern与static的使用注意(C语言)
    《黑马程序员》 typedef的使用方法(C语言)
  • 原文地址:https://www.cnblogs.com/87hbteo/p/7631221.html
Copyright © 2011-2022 走看看