ural1030有一点恶心, 写了半天才把公式推出来
/*以地心为原点建立空间直角坐标系*/
const s=纬度; t=经度; r=6875/2;
x=r*cos(s)*sin(t);
if t in west then x:=x*(-1);
y=r*cos(s)*cos(t);
z=r*sin(s);
if s in south then z:=z*(-1);
d:=sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
ans:=arcsin((d/2)/r)*2*r;
//代码有点乱
const r=6875/2;
var i,j,k,m,n,l:longint;
direction:array[1..2,1..3]of extended;
ss,t:string;
function get(var s:string):longint;
var k:longint;
begin
k:=0;
while (s[1]<'0')or(s[1]>'9') do delete(s,1,1);
while (s[1]>='0')and(s[1]<='9') do
begin
k:=k*10+ord(s[1])-ord('0');
delete(s,1,1);
end;
get:=k;
end;
procedure get_direction(e:longint);
var ok,h,m,s:longint;
temp:extended;
begin
h:=get(ss);
m:=get(ss);
s:=get(ss);
direction[e,3]:=r*sin((h+m/60+s/3600)/180*pi);
temp:=r*cos((h+m/60+s/3600)/180*pi);
if ss[3]='S' then direction[e,3]:=-1*direction[e,3];
h:=get(t);
m:=get(t);
s:=get(t);
direction[e,1]:=temp*sin((h+m/60+s/3600)/180*pi);
direction[e,2]:=temp*cos((h+m/60+s/3600)/180*pi);
if t[3]='W' then direction[e,1]:=-1*direction[e,1];
end;
procedure solve;
var dis,ans:extended;
begin
for i:=1 to 4 do readln(ss);
readln(t);
get_direction(1);
for i:=1 to 2 do readln(ss);
readln(t);
get_direction(2);
dis:=0;
for i:=1 to 3 do dis:=dis+sqr(direction[1,i]-direction[2,i]);
dis:=sqrt(dis)/2;
if dis=r then ans:=r*pi
else ans:=arctan(dis/sqrt(sqr(r)-sqr(dis)))*2*r;
writeln('The distance to the iceberg: ',ans:1:2,' miles.');
if round(ans*100)<10000 then writeln('DANGER!');
end;
begin
solve;
end.