POJ 2354 Titanic
問題
船の現在位置と、氷山の現在位置が与えられる。
船と氷山の距離を答えよ。
位置は緯度、経度によって与えられる。
地球は直径6875マイルの球とし、距離は地球表面上の最短距離をいうものとする。
方針
よくある球面上の距離を求める問題。
切断面を考えて、三角関数を使って求める。
ソースコード
const double PI=acos(-1.0); string a,b,c,d; void calc(double &x,double &y,double &z){ double la,lo; rep(i,a.size())if(!isdigit(a[i]))a[i]=' '; { stringstream ss(a); int p,q,r; ss>>p>>q>>r; la=p+q/60.0+r/3600.0; if(b[0]=='S')la*=-1; la*=PI/180; } rep(i,c.size())if(!isdigit(c[i]))c[i]=' '; { stringstream ss(c); int p,q,r; ss>>p>>q>>r; lo=p+q/60.0+r/3600.0; if(d[0]=='E')lo*=-1; lo*=PI/180; } z=sin(la); y=cos(la)*sin(lo); x=cos(la)*cos(lo); } int main() { rep(i,10)cin>>a; cin>>b>>c>>c>>d; double x1,y1,z1,x2,y2,z2; calc(x1,y1,z1); rep(i,6)cin>>a; cin>>b>>c>>c>>d; calc(x2,y2,z2); #define sq(x) (x)*(x) double r=sqrt(sq(x1-x2)+sq(y1-y2)+sq(z1-z2)); double t=asin(r/2)*2; int d=(int)(t*6875*50+0.5); printf("The distance to the iceberg: %.2f miles.\n",d/100.0); if(d<10000)puts("DANGER!"); return 0; }