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;
}