top1编程
← 返回题目
题解

【基础】游览动物园

1 条题解

  • 0
    @ 2026-7-31 15:52:50

    解题思路

    小红在某个游览区,要找离她最近的另一个游览区。只能上下左右走,所以距离用曼哈顿距离。如果有多个一样近,选离出口最近的。

    思路:逐个比较。

    1. 读入小红位置 (a,b) 和所有游览区
    2. 对每个游览区(跳过小红当前所在的区域):
      • 到小红的距离 = |x-a| + |y-b|
      • 到出口的距离 = x + y(出口在原点)
    3. 选距离最小的;距离相同就选离出口最近的

    为什么要跳过当前区域? 因为小红已经在这个区域,要去的是另一个游览区,不能算自己。

    为什么距离是 |x-a|+|y-b|? 只能上下左右走,所以从一个点走到另一个点,横向走 |x-a| 步、纵向走 |y-b| 步,加起来就是最短步数。

    举例:小红在 (3,2),最近的游览区距离都是 3 的有猴山 (2,0) 和虎山 (5,3):

    • 猴山到出口距离 2+0=2
    • 虎山到出口距离 5+3=8
    • 选猴山 (2,0)

    参考代码

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        int a, b, n;
        cin >> a >> b;
        cin >> n;
    
        int x[105], y[105];
        for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
    
        int bestX = 0, bestY = 0;
        int bestDist = 1 << 30, bestExit = 1 << 30;
    
        for (int i = 0; i < n; i++) {
            if (x[i] == a && y[i] == b) continue;  // 跳过当前区域
    
            int d = abs(x[i] - a) + abs(y[i] - b);  // 到小红距离
            int e = x[i] + y[i];                    // 到出口距离
    
            if (d < bestDist || (d == bestDist && e < bestExit)) {
                bestDist = d;
                bestExit = e;
                bestX = x[i];
                bestY = y[i];
            }
        }
    
        cout << bestX << " " << bestY << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),逐个比较
    • 空间复杂度:O(N),存坐标数组
    • 1