1 条题解
-
0
解题思路
这道题目要求计算地球上两个城市之间的球面距离(大圆距离),即两点间的最短路径长度。解题步骤如下:
-
输入处理
- 读取城市列表,存储每个城市的名称、纬度和经度。
- 使用
map
或unordered_map
来建立城市名称到坐标的映射,方便查询。
-
查询处理
- 对于每个查询,检查两个城市是否存在于城市列表中。
- 如果任一城市不存在,输出
Unknown
。 - 如果两个城市相同,距离为
0 km
。
-
球面距离计算
- 使用 Haversine 公式 计算两点间的弧长。
- 公式推导:
- 将经纬度从角度转换为弧度。
- 计算纬差(
Δlat
)和经差(Δlon
)。 - 应用 Haversine 公式计算
a
和c
,最终得到距离d = R * c
(R
是地球半径)。
-
输出结果
- 按格式输出查询结果,并四舍五入到最近的整数。
C++ 代码实现
#include <iostream> #include <string> #include <map> #include <cmath> #include <iomanip> using namespace std; const double PI = 3.141592653589793; const double R = 6378.0; struct City { string name; double lat; double lon; }; double toRadians(double degree) { return degree * PI / 180.0; } double calculateDistance(double lat1, double lon1, double lat2, double lon2) { double phi1 = toRadians(lat1); double phi2 = toRadians(lat2); double delta_phi = toRadians(lat2 - lat1); double delta_lambda = toRadians(lon2 - lon1); double a = sin(delta_phi / 2) * sin(delta_phi / 2) + cos(phi1) * cos(phi2) * sin(delta_lambda / 2) * sin(delta_lambda / 2); double c = 2 * atan2(sqrt(a), sqrt(1 - a)); double distance = R * c; return distance; } int main() { map<string, City> cities; string line; // 读取城市列表 while (true) { string name; double lat, lon; cin >> name; if (name == "#") break; cin >> lat >> lon; City city; city.name = name; city.lat = lat; city.lon = lon; cities[name] = city; } // 处理查询 string city1, city2; while (cin >> city1 >> city2) { if (city1 == "#" && city2 == "#") break; cout << city1 << " - " << city2 << endl; if (cities.find(city1) == cities.end() || cities.find(city2) == cities.end()) { cout << "Unknown" << endl; } else { City c1 = cities[city1]; City c2 = cities[city2]; double distance = calculateDistance(c1.lat, c1.lon, c2.lat, c2.lon); long rounded = static_cast<long>(distance + 0.5); cout << rounded << " km" << endl; } cout << endl; } return 0; }
-
- 1
信息
- ID
- 1255
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者