1 条题解

  • 0
    @ 2025-5-6 19:48:03

    解题思路

    这道题目要求计算地球上两个城市之间的球面距离(大圆距离),即两点间的最短路径长度。解题步骤如下:

    1. 输入处理

      • 读取城市列表,存储每个城市的名称、纬度和经度。
      • 使用 mapunordered_map 来建立城市名称到坐标的映射,方便查询。
    2. 查询处理

      • 对于每个查询,检查两个城市是否存在于城市列表中。
      • 如果任一城市不存在,输出 Unknown
      • 如果两个城市相同,距离为 0 km
    3. 球面距离计算

      • 使用 Haversine 公式 计算两点间的弧长。
      • 公式推导:
        1. 将经纬度从角度转换为弧度。
        2. 计算纬差(Δlat)和经差(Δlon)。
        3. 应用 Haversine 公式计算 ac,最终得到距离 d = R * cR 是地球半径)。
    4. 输出结果

      • 按格式输出查询结果,并四舍五入到最近的整数。

    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
    上传者