PKU 3407 Brookebond s'en va en guerre...

http://poj.org/problem?id=3407
地球上の2地点の緯度と経度が与えられる。
この時に、この2点間の地球表面での距離を求めろというような問題。

地球の中心に対する2点間の角度を求めて、半径をかける。

typedef struct{
  double x,y,z;
  double norm(){
    return sqrt(x*x+y*y+z*z);
  }
}po;

double operator*(const po&r,const po&l){
  return r.x*l.x+r.y*l.y+r.z*l.z;
}

po getpo(){
  int de,mi;
  char ch;
  double th,ph;
  cin>>de>>mi;
  cin>>ch;
  th=(de+mi/60.0)*M_PI/180.0;
  if(ch=='S')th=-th;
  cin>>de>>mi;
  cin>>ch;
  ph=(de+mi/60.0)*M_PI/180.0;
  if(ch=='E')ph=-ph;
  return (po){cos(th)*cos(ph),cos(th)*sin(ph),sin(th)};
}

main(){
  po p1=getpo();
  po p2=getpo();
  double ang=acos(p1*p2/p1.norm()/p2.norm());
  printf("%.3f\n",6370*ang);
}