1. 程式人生 > >SOJ 1085 SCU 簡單計算幾何

SOJ 1085 SCU 簡單計算幾何

相交點 pri 我們 nio 輸入 std 但是 class 輸入數據

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\n"); else if(r1*r1-d1==r2*r2-d2) printf("No\n"); else printf("Yes\n"); } return 0; }

SOJ 1085 SCU 簡單計算幾何