当前位置:编程学习 > C/C++ >>

HDU 1140 War on weather

有一些卫星在天上,还有一些目标在地球表面,判断一下有多少目标会被卫星看见。
 
设卫星为 S,目标为T,球心为O,过T做地球切线切点为A。
 
一开始想判断∠STO是否 >= 90°,但是一直不对,可能是精度的问题。
 
然后又用比较ST是否 <= SA 的方法 ,过了。
 
总之这又是个比较简单的题。
 
 
 
#include <iostream>  
#include <cstring>  
#include <cstdlib>  
#include <cstdio>  
#include <queue>  
#include <cmath>  
#include <algorithm>  
  
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<<Count<<endl;  
    }  
    return 0;  
}  

 


补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,