题解
【基础】游览动物园
1 条题解
-
0
解题思路
小红在某个游览区,要找离她最近的另一个游览区。只能上下左右走,所以距离用曼哈顿距离。如果有多个一样近,选离出口最近的。
思路:逐个比较。
- 读入小红位置 (a,b) 和所有游览区
- 对每个游览区(跳过小红当前所在的区域):
- 到小红的距离 = |x-a| + |y-b|
- 到出口的距离 = x + y(出口在原点)
- 选距离最小的;距离相同就选离出口最近的
为什么要跳过当前区域? 因为小红已经在这个区域,要去的是另一个游览区,不能算自己。
为什么距离是 |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