题目链接:POJ 2254

Description

As a member of an ACM programming team you'll soon find yourself always traveling around the world: Zürich, Philadelphia, San José, Atlanta,... from 1999 on the Contest Finals even will be on a different continent each year, so one day you might get to Japan or Australia.

At the contest site it would be interesting to know how many miles you are away from home. For this sake, your job is to write a program to compute the geographical distance between two given locations on the Earth's surface.

We assume that the Earth is a perfect sphere with a radius of exactly 6378 km. The geographical distance between A and B is the length of the geodetic line segment connecting A and B.

The geodetic line segment between two points on a sphere is the shortest connecting curve lying entirely in the surface of the sphere.

The value of pi is approximately 3.141592653589793.

Input

The input will consist of two parts: a list of cities and a list of queries.

City List

The city list consists of up to 100 lines, one line per city. Each line will contain a string ci and two real numbers lati and longi, representing the city name, its latitude and its longitude, respectively.

The city name will be shorter than 30 characters and will not contain white-space characters.

The latitude will be between -90 (South Pole) and +90 (North Pole). The longitude will be between -180 and +180 where negative numbers denote locations west of the meridian and positive numbers denote locations east of the meridian. (The meridian passes through Greenwich, London.)

The city list will be terminated by a line consisting of a single "#".

Query List

Each line will contain two city names A and B.

The query list will be terminated by the line "# #".

Output

For each query, print a line saying "A - B" where A and B are replaced by the city names. Then print a line saying x km" where x is replaced by the geographical distance (in km) between the two cities, rounded to the nearest integer.

If one of the cities in the query didn't occur in the city list, print a line saying "Unknown" instead. Print a blank line after each query.

Sample Input

Ulm		48.700	10.500
Freiburg 47.700 9.500
Philadelphia 39.883 -75.250
SanJose 37.366 -121.933
NorthPole 90 0
SouthPole -90 0
#
Ulm Philadelphia
Ulm SanJose
Freiburg Philadelphia
Freiburg SanJose
Ulm Freiburg
SanJose Philadelphia
Ulm LasVegas
Ulm Ulm
Ulm NorthPole
Ulm SouthPole
NorthPole SouthPole
# #

Sample Output

Ulm - Philadelphia
6536 km Ulm - SanJose
9367 km Freiburg - Philadelphia
6519 km Freiburg - SanJose
9412 km Ulm - Freiburg
134 km SanJose - Philadelphia
4023 km Ulm - LasVegas
Unknown Ulm - Ulm
0 km Ulm - NorthPole
4597 km Ulm - SouthPole
15440 km NorthPole - SouthPole
20037 km

Source

Ulm Local 1997

Solution

题意

给定一些城市的经纬度,然后给出若干个询问,每个询问包含两个城市,求这两个城市的球面最短距离。

思路

已知两点经纬度求球面最短距离的公式:

\(AB = R\cdot arccos(cos(wA)cos(wB)cos(jB-jA)+sin(wA)sin(wB))\)

其中 \(wA\) 和 \(jA\) 代表 \(A\) 的纬度和经度,\(wB\) 和 \(jB\) 代表 \(B\) 的纬度和经度。

证明见:关于已知两点经纬度求球面最短距离的公式推导

Code

#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long ll;
typedef double db;
const db pi = 3.141592653589793;
const db r = 6378.0; class Point {
public:
double j, w;
Point(double j = 0, double w = 0) : j(j), w(w) {}
void input() {
scanf("%lf%lf", &w, &j);
w = w * pi / 180.0;
j = j * pi / 180.0;
}
db dis(Point a) {
return r * acos(cos(w) * cos(a.w) * cos(a.j - j) + sin(w) * sin(a.w));
}
}; map<string, Point> mp; int main() {
string s1, s2;
while((cin >> s1) && s1[0] != '#') {
Point tmp;
tmp.input();
mp[s1] = tmp;
}
Point p1, p2;
while(cin >> s1 >> s2) {
if(s1[0] == '#' && s2[0] == '#') {
break;
}
cout << s1 << " - " << s2 << endl;
if(mp.find(s1) != mp.end() && mp.find(s2) != mp.end()) {
p1 = mp[s1], p2 = mp[s2];
double ans = p1.dis(p2);
printf("%.0lf km\n\n", ans);
} else {
printf("Unknown\n\n");
}
}
return 0;
}

POJ 2254 Globetrotter (计算几何 - 球面最短距离)的更多相关文章

  1. POJ 1410 Intersection (计算几何)

    题目链接:POJ 1410 Description You are to write a program that has to decide whether a given line segment ...

  2. POJ 1106 Transmitters(计算几何)

    题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...

  3. poj 2507Crossed ladders <计算几何>

    链接:http://poj.org/problem?id=2507 题意:哪个直角三角形,一直角边重合, 斜边分别为 X, Y, 两斜边交点高为 C , 求重合的直角边长度~ 思路: 设两个三角形不重 ...

  4. TOYS - POJ 2318(计算几何,叉积判断)

    题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数.   分析:做的第一道计算几何题目....使用叉积判断方 ...

  5. POJ 1654 Area 计算几何

    #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> usi ...

  6. A - TOYS(POJ - 2318) 计算几何的一道基础题

    Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...

  7. hdu 4454 Stealing a Cake(计算几何:最短距离、枚举/三分)

    题意:已知起点.圆.矩形,要求计算从起点开始,经过圆(和圆上任一点接触即可),到达矩形的路径的最短距离.(可以穿过园). 分析:没什么好的方法,凭感觉圆上的每个点对应最短距离,应该是一个凸函数,用三分 ...

  8. poj 2318 TOYS(计算几何 点与线段的关系)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12015   Accepted: 5792 Description ...

  9. POJ 3304 Segments(计算几何)

    意甲冠军:给出的一些段的.问:能否找到一条直线,通过所有的行 思维:假设一条直线的存在,所以必须有该过两点的线,然后列举两点,然后推断是否存在与所有的行的交点可以是 代码: #include < ...

随机推荐

  1. Python Django 编写一个简易的后台管理工具1-安装环境

    安装python环境 MAC 一般都会自带 Python2.x版本 的环境,你也可以在链接 https://www.python.org/downloads/mac-osx/ 上下载最新版安装. 安装 ...

  2. 3天教你掌握Python必备常用英语词汇

    第一天 path [ pɑ:θ ] 路径 unexpected [ˌʌnɪkˈspektɪd] 不期望的 class [klɑ:s] 类 usage [ˈju:sɪdʒ] 使用 public ['p ...

  3. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  4. Selenium:三种等待方式详解

    我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间. 我们平常用到的有三种等待方式: 强制等待 隐式等待 显示等待 一. ...

  5. input只读效果

    有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input无效,及其value不会 ...

  6. C# DataTable转json 时间格式化

    1.NewTonSoft.json public static string DataTableToJson(DataTable dt) { ) { return ""; } el ...

  7. js 基础 for in 和 for of的区别详解

    for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { a: 1, b: 2, c: 3 } for (let i ...

  8. mySQL部分疑问和小结(orale)

    2015/10/15 1.mysql语句: ALTER table scfz_xewp add BGR varchar(255) after KYR 2.创建触发器时:  --/   CREATE D ...

  9. Centos安装IDEA

    1.官网下载tar包 到https://www.jetbrains.com/idea 下载对应版本的文件 将其解压 tar zvxf idea下载文件.tar 进入到解压后文件夹的bin目录下执行 . ...

  10. sub

    Popen.communicate(input=None)¶Interact with process: Send data to stdin. Read data from stdout and s ...