HDU 1140 War on weather

2014-11-24 00:04:22 · 作者: · 浏览: 3
有一些卫星在天上,还有一些目标在地球表面,判断一下有多少目标会被卫星看见。
设卫星为 S,目标为T,球心为O,过T做地球切线切点为A。
一开始想判断∠STO是否 >= 90°,但是一直不对,可能是精度的问题。
然后又用比较ST是否 <= SA 的方法 ,过了。
总之这又是个比较简单的题。
#include   
#include   
#include   
#include   
#include   
#include   
#include   
  
using namespace std;  
  
struct P  
{  
    double x,y,z;  
};  
  
double er;  
  
bool judgedel(P S,P T)  
{  
    double a,b,c,Maxlen;  
    a = (S.x-T.x)*(S.x-T.x) + (S.y-T.y)*(S.y-T.y) + (S.z-T.z)*(S.z-T.z);  
    b = T.x*T.x + T.y*T.y + T.z+T.z;  
    c = S.x*S.x + S.y*S.y + S.z*S.z;  
  
    Maxlen = c - er;  
  
    if(a <= Maxlen)  
        return true;  
    return false;  
}  
  
int main()  
{  
    int i,j;  
    int n,m,Count;  
  
    bool mark[110];  
  
    P s[110],t[110];  
  
    er = 20000.0/acos(-1);  
    er *= er;  
  
    while(scanf("%d %d",&n,&m) && (n||m))  
    {  
        for(i = 0;i < n; ++i)  
            cin>
>s[i].x>>s[i].y>>s[i].z; for(j = 0;j < m; ++j) cin>>t[j].x>>t[j].y>>t[j].z; memset(mark,false,sizeof(mark)); Count = 0; for(i = 0;i < n; ++i) { for(j = 0;j < m; ++j) { if(mark[j] == false && judgedel(s[i],t[j])) { mark[j] = true; Count++; } } } cout<